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); } 这可以很好地编译,但在运行时会中

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);
}

这可以很好地编译,但在运行时会中断。我认为它会运行良好,编译器会警告您。

编译器会就此向您发出警告

使用-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,谢谢你提及。