Java限制了对字段的通用约束

时间:2011-02-01 10:30:21

标签: java generics

有几次我觉得有必要做以下事情:

private <T extends Type> Map<GenericClass1<T>,GenericClass2<T>> map;

......或者那种效果。基本上,在map的两个参数中使用相同的边界。 (这不是一个实际的例子,只是显示了这个想法。)

我知道(不幸的是)这是不可能的,它只适用于类定义和方法签名。然而,我的问题是为什么不在字段上提供?这纯粹是一种设计选择,还是有一些我缺失的技术原因?我已经有了一个想法,并且无法从技术角度看出为什么这是不可能的,因为我可以看到编译器正确地处理它的所有内容,并且在运行时不需要通用信息

4 个答案:

答案 0 :(得分:1)

&LT; T&GT;意味着一个阶级,而不是一个阶级。 当你的对象被实例化时,T被绑定到这个ONE类。

您正在尝试将两个具有不同接口的对象(因为它们采用/返回不同类型而不同地使用)放入同一个容器中。这是一个错误,因为当你从容器(地图)中取出它们时,你不知道它是什么。

希望这是您正在寻找的答案。

编辑:那说你可以拥有一个容纳基于那个类的成员的容器,为EACH类型的T自动创建一个新的地图。然后你需要知道T是什么才能访问它。 一般情况下,如果您不再需要类型信息,请将其丢弃。如果你这样做,那么把它放在同一个容器中就像其他类型的东西一样,无论如何都会把它丢弃。但

答案 1 :(得分:1)

假设您要实例化map变量。从理论上讲,你必须写下这样的东西:

map = new HashMap<GenericClass1<String>,GenericClass2<String>>();

确定。但是现在对我来说没有意义的 putget方法接受/返回的参数是什么? 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>();

我希望这会有所帮助。