Java通用类型存储条件

时间:2010-11-16 14:01:48

标签: java generics type-erasure effective-java

我一直在阅读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类型并构建一个新的对象列表?

我可以忽略未经检查的投射警告,但我只是想尽力而为。有什么建议?提示?花样?

4 个答案:

答案 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<?>>