我一直在阅读Effective Java,并决定尝试将我学到的一些内容付诸实践。我正在尝试有效地创建一个Multimap<?, Condition<?> >
,其中外卡与键和值的类型相同,但它将是不同的,不同的类型。
以下是我正在查看的书中的项目:Item 29
我不是想完全复制它。我意识到最大的区别是密钥不能直接表示链接的值。在我的中,键代表值的泛型类型。
所以我会做mmap.put(Class<Integer>, ConditionMapping<Integer>)
当我执行get时,我没有ConditionMapping的泛型类型,所以我得到了未经检查的强制警告。
我有一个get方法,我想要签名<T> List<Condition <T> >(Class<T> type)
由于类型擦除,我唯一的选择是确保condition.value是T类型并构建一个新的对象列表?
我可以忽略未经检查的投射警告,但我只是想尽力而为。有什么建议?提示?花样?
答案 0 :(得分:1)
如果您使接口扩展Multimap<Void, Condition<?>>
,它允许您的用户调用一些不依赖于类型安全的方法(例如containsKey),但不能添加条目(绕过类型检查的代理方法),除非他们使用未经检查的演员表。
interface ConditionMapBase<T> extends Multimap<T, Condition<?>> {
}
interface ConditionMap extends ConditionMapBase<Void> {
<T>boolean putCondition(T key, Condition<T> value);
<T>Collection<Condition<T>> getConditions(T key);
}
class ConditionMapImpl
extends ForwardingMultimap<Void, Condition<?>>
implements ConditionMap {
ConditionMapImpl() {
delegate = HashMultimap.create();
}
@SuppressWarnings("unchecked")
@Override
protected Multimap<Void, Condition<?>> delegate() {
return (Multimap<Void, Condition<?>>) (Multimap<?, ?>) delegate;
}
private final Multimap<Object, Condition<?>> delegate;
@SuppressWarnings("unchecked")
@Override
public <T> Collection<Condition<T>> getConditions(T key) {
return (Collection<Condition<T>>) (Collection<?>) ((ConditionMapBase<T>) this).get(key);
}
@SuppressWarnings("unchecked")
@Override
public <T> boolean putCondition(T key, Condition<T> value) {
return ((ConditionMapBase<T>) this).put(key, value);
}
}
答案 1 :(得分:1)
没有办法表明这两个通配符应该捕获相同的类型。有关类似情况和一些可能的解决方案,请参阅this question。
答案 2 :(得分:0)
你可以创建一个MyClass,然后将你自己的类型传递给它,并在其中封装Multimap。 Java中的模板不可能通常可以通过添加另一个层来解决,可以说,并根据您真正想要的内容模板化类,因为您可以通过这种方式获得“T”类型,然后可以将其用于列表或地图,以及保证从那时起对多个模板都是一样的。
答案 3 :(得分:0)
这可能是朝着正确方向迈出的一步。
<Multimap<Class<?>, Condition<?>>