1

我不太清楚如何表达我的问题,所以我举个例子:

以这张地图为例:

Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;

例如MyClass,它映射DatabaseEntry到它的IDecorator<MyClass>. 上述陈述的问题在于,它太不具体了。我想要更多的类型安全。像这样的东西:

Map<Class<T extends DatabaseEntry>, Class<? extends IDecorator<T>>> map;

当然, T 会因条目而异,但我想要的是,如果我调用:

map.get(MyClass.class);

返回类型将IDecorator<MyClass>IDecorator<? extends DatabaseEntry>

有一个简单的解决方案吗?

4

2 回答 2

3

正如@zaske 在他的回答中已经指出的那样,这似乎是不可能的。

根据您已经在考虑的内容,您可以将您的类包装Map在一个类中,该类提供您想要的泛型getput方法。

public class MapWrapper { 

    Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;
    public <T extends DatabaseEntry> Class<IDecorator<T>> put (Class<T> k, Class<IDecorator<T>> v){
        return (Class<IDecorator<T>>) map.put(k,v);
    }

    public <T extends DatabaseEntry> Class<IDecorator<T>> getObject(Class<T> k) {
        return (Class<IDecorator<T>>) map.get(k);
    }
}
于 2012-12-07T13:52:06.370 回答
2

据我所知 - 没有办法做到这一点。
您当然不能使用 T,T 必须是通用定义的一部分,
并且不能在这样的变量的独立定义中,这就是您使用通配符 (?) 的目的。
由于您的地图正在获取 Class 的键和值对象,
您甚至无法通过简单地扩展键和值的类型来解决这个问题(因为 Class 是最终的)。

于 2012-12-07T13:19:17.193 回答