有几次我觉得有必要做以下事情:
private <T extends Type> Map<GenericClass1<T>,GenericClass2<T>> map;
......或者那种效果。基本上,在map的两个参数中使用相同的边界。 (这不是一个实际的例子,只是显示了这个想法。)
我知道(不幸的是)这是不可能的,它只适用于类定义和方法签名。然而,我的问题是为什么不在字段上提供?这纯粹是一种设计选择,还是有一些我缺失的技术原因?我已经有了一个想法,并且无法从技术角度看出为什么这是不可能的,因为我可以看到编译器正确地处理它的所有内容,并且在运行时不需要通用信息
答案 0 :(得分:1)
&LT; T&GT;意味着一个阶级,而不是一个阶级。 当你的对象被实例化时,T被绑定到这个ONE类。
您正在尝试将两个具有不同接口的对象(因为它们采用/返回不同类型而不同地使用)放入同一个容器中。这是一个错误,因为当你从容器(地图)中取出它们时,你不知道它是什么。
希望这是您正在寻找的答案。
编辑:那说你可以拥有一个容纳基于那个类的成员的容器,为EACH类型的T自动创建一个新的地图。然后你需要知道T是什么才能访问它。 一般情况下,如果您不再需要类型信息,请将其丢弃。如果你这样做,那么把它放在同一个容器中就像其他类型的东西一样,无论如何都会把它丢弃。但
答案 1 :(得分:1)
假设您要实例化map
变量。从理论上讲,你必须写下这样的东西:
map = new HashMap<GenericClass1<String>,GenericClass2<String>>();
确定。但是现在对我来说没有意义的 是put
或get
方法接受/返回的参数是什么? T
?呃... T
是什么? GenericClass1|2<String>
?再没有意义,是吗?毕竟我在String
声明中看不到map
。所以我猜这个通用变量没有真正正确的实例化和使用。
干杯!
答案 2 :(得分:1)
哦,我多么渴望得到类似的东西:
private <T> Map<Class<T>, T> instanceCache;
public <T> T getInstanceOf(Class<T> clazz) {
return instanceCache.get(clazz);
}
但正如你所提到的,在Java中完全不可能。上面的方法声明很好,但没有办法声明变量,以至于方法中没有强制转换。只需将此添加到您讨厌泛型的不断增加的事物列表中并继续前进。
答案 3 :(得分:0)
您可以使用以下?
:
private List<? extends List> l = new ArrayList<List>();
我希望这会有所帮助。