Java按通用类型存储条件

我一直在阅读Effective Java,并决定尝试将我学到的一些内容付诸实践。我正在尝试有效地创建一个
Multimap<?, Condition<?> >
,其中通配符对于键和值都是相同的类型,但它将是不同的,不同的类型。 这是我正在看的书中的项目:第29项 我不是想完全复制它。我意识到最大的区别是密钥不能直接表示链接的值。在我的中,键代表值的泛型类型。 所以我会做
mmap.put(Class<Integer>, ConditionMapping<Integer>)
当我做get时我没有ConditionMapping的泛型类型,所以我得到了未经检查的强制转换警告。 我有一个get方法,我想要签名
<T> List<Condition <T> >(Class<T> type)
由于类型擦除,我唯一的选择是确保condition.value是T类型并构建一个新的对象列表? 我可以忽略未经检查的投射警告,但我只是想尽力而为。有什么建议?提示?窍门?     
已邀请:
没有办法表明这两个通配符应该捕获相同的类型。有关类似情况和一些可能的解决方案,请参阅此问题。     
如果你使接口扩展
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);
    }
}
    
您可以创建一个MyClass,然后将您自己的类型传递给它,并在其中封装Multimap。 Java中的模板不可能通常可以通过添加另一个层来解决,可以说,并根据您真正想要的内容模板化类,因为您可以通过这种方式获得“T”类型,然后可以将其用于列表或地图,以及保证从那时起多个模板的相同。     
这可能是朝着正确方向迈出的一步。
<Multimap<Class<?>, Condition<?>>
    

要回复问题请先登录注册