为什么在Java中将字符串添加到ArrayLists所需的转换或使用泛型?

Ron*_*ald 3 java string generics casting

我正在尝试理解ArrayLists,并且在此过程中已经意识到我还需要了解泛型,原始类型以及有关类型转换的更多信息.我正在阅读Oracle教程,这是他们为泛型有用的原因提供的示例:

以下没有泛型的代码片段需要强制转换:

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这里需要类型转换,因为据我所知,'list.get(0)'在类型转换之前和之后都是'String'类型.我在这里使用代码检查类型,不确定它是否正确.

List list = new ArrayList();
list.add("hello");

Object obj= list.get(0);

Class cls=obj.getClass();

String answer = cls.getSimpleName();
System.out.println(answer);

String s = (String) list.get(0);

Object obj2= list.get(0);

Class cls2=obj2.getClass();
System.out.println(cls2);

String answer2 = cls2.getSimpleName();
System.out.println(answer2);
Run Code Online (Sandbox Code Playgroud)

所以我要求解释为什么在这里需要类型转换,在这里通常是非通用的Arraylists.

Joh*_*ica 8

运行时类型String,但是编译时类型Object.编译器不知道raw ArrayList持有什么,所以当你调用get()它时,它会分配一个编译时类型Object.一个Object不能被直接分配给String,从而铸造.

演员是开发人员对编译器说的方式,"你认为它是一个Objects 的列表,但是相信我,我正在推出的东西绝对是一个String."