JavaJDK6是否允许非通用遗留代码?
JavaJDK6是否支持旧的非泛型集合,还是会在运行时破坏现有代码 如果它确实支持它,您是否必须启用它 例如:JavaJDK6是否允许非通用遗留代码?,java,generics,Java,Generics,JavaJDK6是否支持旧的非泛型集合,还是会在运行时破坏现有代码 如果它确实支持它,您是否必须启用它 例如: List<Integer> list = new ArrayList<Integer>(); list.add(5); Alpha a = new Alpha(); a.insert(list); for (Integer integer : list) { System.out.println(integer); } 这可以很好地编译,但在运行时会中
List<Integer> list = new ArrayList<Integer>();
list.add(5);
Alpha a = new Alpha();
a.insert(list);
for (Integer integer : list) {
System.out.println(integer);
}
这可以很好地编译,但在运行时会中断。我认为它会运行良好,编译器会警告您。编译器会就此向您发出警告 使用-Xlint选项运行javac以获取完整的详细信息 警告:[未选中]未选中将(E)添加为原始类型java.util.List的成员的调用 添加(新字符串(“50”)) 如果要使用非类型化(原始类型)列表,则只需使用类似的遗留代码创建一个列表:
public class Alpha {
public void insert(List list) {
list.add(new String("50"));
}
}
List list = new ArrayList();
但是,当您将添加到列表中的字符串转换为整数时,代码在运行时仍然会失败。编译器会就此发出警告 使用-Xlint选项运行javac以获取完整的详细信息 警告:[未选中]未选中将(E)添加为原始类型java.util.List的成员的调用 添加(新字符串(“50”)) 如果要使用非类型化(原始类型)列表,则只需使用类似的遗留代码创建一个列表:
public class Alpha {
public void insert(List list) {
list.add(new String("50"));
}
}
List list = new ArrayList();
但是,当您将添加到列表中的字符串强制转换为整数时,代码在运行时仍然会失败。泛型只在编译时存在。(不完全是这样;到处都是元数据,但对象类型本身不会受到影响,尤其是支持
ArrayList
的数组仍然是object[]
。这在这里非常重要。)您可以始终将泛型类型当作非泛型类型使用—编译器会警告您,但课堂本身并不能阻止你这么做
您的代码中断,因为您在此处将数组的每个元素隐式转换为整数:
for (Integer integer : list) {
System.out.println(integer);
}
您希望在执行时如何处理该问题?需要明确的是,编译后的代码大致相当于:
for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
Integer integer = (Integer) list.next();
System.out.println(integer);
}
想象一下,在一个没有泛型的世界里,如果列表中有一个
字符串
(由于Alpha
,确实是这样),那会怎么样呢。泛型也会发生同样的事情(一个ClassCastException
)。泛型只在编译时存在。(不完全是这样;到处都是元数据,但对象类型本身不会受到影响,尤其是支持ArrayList
的数组仍然是object[]
。这在这里非常重要。)您可以始终将泛型类型当作非泛型类型使用—编译器会警告您,但课堂本身并不能阻止你这么做
您的代码中断,因为您在此处将数组的每个元素隐式转换为整数:
for (Integer integer : list) {
System.out.println(integer);
}
您希望在执行时如何处理该问题?需要明确的是,编译后的代码大致相当于:
for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
Integer integer = (Integer) list.next();
System.out.println(integer);
}
想象一下,在一个没有泛型的世界里,如果列表中有一个
字符串
(由于Alpha
,确实是这样),那会怎么样呢。泛型也会发生同样的情况(一个ClassCastException
)。如果您不使用泛型,编译器不会警告您。所以Java6与遗留代码不兼容?我没说过。Java6肯定与遗留代码兼容。它只在编译时使用不正确的原始类型时才会发出警告。在旧的Java版本中,如果不使用泛型,则会出现完全相同的问题。尽管Java与旧代码兼容,但在您的示例中,它只是中断,因为它试图将列表中的元素(字符串)转换为整数(这会导致ClassCastException)。这将起作用:对于(对象o:list){System.out.println(o);},如果不使用泛型,编译器不会警告您。所以Java6与遗留代码不兼容?我没说过。Java6肯定与遗留代码兼容。它只在编译时使用不正确的原始类型时才会发出警告。在旧的Java版本中,如果不使用泛型,则会出现完全相同的问题。尽管Java与旧代码兼容,但在您的示例中,它只是中断,因为它试图将列表中的元素(字符串)转换为整数(这会导致ClassCastException)。这将起作用:对于(对象o:list){System.out.println(o);}是的,我明白了,很好的解释。我去了伦敦的乔尔·斯波尔斯基(joel spolsky)演讲,他提到你是社区的伟大贡献者,现在我知道原因了。:)@纳库尔:恐怕我不明白你的评论。老实说,我想你最好还是问一个新问题。当然,我会的。但我会等你的答复,我明白了,很好的解释。我去了伦敦的乔尔·斯波尔斯基(joel spolsky)演讲,他提到你是社区的伟大贡献者,现在我知道原因了。:)@纳库尔:恐怕我不明白你的评论。老实说,我想你最好还是问一个新问题。当然,我会的。但我会等你的回答。我知道了,我不知道-Xlint,谢谢你提及。是的,我知道了,我不知道-Xlint,谢谢你提及。