Java泛型:直接强制转换为泛型超类型或首先执行原始类型

Java泛型:直接强制转换为泛型超类型或首先执行原始类型,java,generics,Java,Generics,为什么不允许这样?(编译时错误) List o1=new ArrayList(); 那么为什么允许这样做呢?(仅限警告) List o2=(List)new ArrayList(); Java没有具体化的类型,除非编译器可以检查这是否正常,否则没有运行时检查 这是允许向后兼容的。i、 e.对于没有泛型的代码 它会产生一个警告,即使不允许从泛型集合强制转换为非泛型集合,您也始终需要能够执行类似的操作 Object o = new ArrayList<String>(); List&l

为什么不允许这样?(编译时错误)

List o1=new ArrayList();
那么为什么允许这样做呢?(仅限警告)

List o2=(List)new ArrayList();

Java没有具体化的类型,除非编译器可以检查这是否正常,否则没有运行时检查

这是允许向后兼容的。i、 e.对于没有泛型的代码

它会产生一个警告,即使不允许从泛型集合强制转换为非泛型集合,您也始终需要能够执行类似的操作

Object o = new ArrayList<String>();
List<Object> list = (List<Object>) o;
objecto=newarraylist();
列表=(列表)o;
例如,当您序列化一个对象时,只写一个对象,而当您反序列化它时,
readObject()
只返回一个对象。您可以选择如何将其强制转换为特定类型。

列表
不是
数组列表
的超级类型。转换为该类型是不安全的,因为它允许您将任意
对象
添加到
ArrayList
中,这可能会导致运行时错误,其中预期为
字符串
的代码接收到不同类型的对象

List<String> a = new ArrayList<>();
// this next line is not allowed but let's assume it was
// List<Object> o1 = a;
Integer i = 5;
o1.add(i);
// this next line would cause a runtime error, but appears safe
String s = a.get(0);
List a=new ArrayList();
//下一行是不允许的,但我们假设它是
//列表o1=a;
整数i=5;
o1.加入(i);
//下一行将导致运行时错误,但看起来是安全的
字符串s=a.get(0);

转换为原始类型首先会绕过编译器通常执行的所有安全检查,因此这是允许的,但出于同样的原因仍然是不安全的。但是,所有使用原始类型都会发出警告,因为它们会导致此类不安全行为。

因为类型转换到原始
列表中。
。因为第一个示例只会导致痛苦和痛苦,就像黑暗面一样。在第二个示例中,您有两个操作,它们都是不可靠的,但都是合法的,因为它们具有有效的用途。和。
Object o = new ArrayList<String>();
List<Object> list = (List<Object>) o;
List<String> a = new ArrayList<>();
// this next line is not allowed but let's assume it was
// List<Object> o1 = a;
Integer i = 5;
o1.add(i);
// this next line would cause a runtime error, but appears safe
String s = a.get(0);