2011-11-29 49 views
4

我想知道为什么会是一个问题,如果Java有泛型没有删除。我知道这个问题是与旧库兼容的问题,但是如果把Object放在我们不指定的类型的地方,那就不行了。例如,我们可以使用List list = new ArrayList();作为List<Object> -s集合,List<Integer> list = new ArrayList<Integer>();将按原样不删除。泛型删除

有人可以举个例子,如果擦除不起作用会发生什么。

+0

我不确定您了解什么类型的删除是... –

+0

您的问题不清楚。此外,您似乎将原始类型与特定类型混淆。 – helpermethod

回答

3

这仍然要求这些旧库在重新编译之前,可以在新的JVM上使用 - 这正是Java设计人员不惜一切代价一直避免的重大改变。

+0

当然,新的Java代码不能在旧的JVM上运行,但这意味着旧的代码无法在新的VM上运行? – George

+0

@George:这就是我说的,是的。 –

+0

是的,我知道新的不会老。很明显,1.5版本的jvms和编译器不知道泛型,但它与库有什么关系。这是“Thinking in Java”的引用。 没有某种迁移路径,随着时间的推移,所有已建立的库存机会被选择迁移到Java泛型的开发人员截断。 – George

3

为了解Java的泛型和特别的类型擦除,您可以找到的最好的资源之一是Angelika Langer的FAQ关于该主题的内容,请看看它,所有内容都将清晰明了。

0

这不是简单的向后兼容性问题,而是migration compatibility。正如您正确地指出的那样,1.5之前的每个列表实际上都是List<Object>,因此定义List := List<Object>本可以工作,并且已经向后兼容。但是,将现有库迁移到1.5并将隐含的List<Object>转换为List<Foo>会破坏客户端代码。输入原始类型..