如何运行泛型Java工作

时间:2014-06-14 06:23:40

标签: java generics casting

如果我声明一个我真正知道的列表“myList”只会包含字符串,我可以将它强制转换为List而没有任何问题,在幕后将列表转换为字符串列表实际上是什么?< / p>

List myList = new ArrayList();
List<String> myStringList = (List<String>) myList;

如果我将列表创建为对象列表,我会假设同样适用但我不能再将其转换回字符串列表,这是什么原因?

List<Object> myObjList = new ArrayList<Object>();
List<String> myStringList = (List<String>) myObjList; // Can't do this!

3 个答案:

答案 0 :(得分:1)

List myList = new ArrayList();
List<String> myStringList = (List<String>) myList;

出于兼容性原因而使用pre-generics代码。它可以工作,但如果原始List不仅包含Strings,它会在运行时给您错误。

泛型应该在编译器时保护你。他们不允许您将list of Objects转换为list of String,因为List<Objects>可能包含非String的对象,并且会在运行时导致错误。

答案 1 :(得分:0)

字符串是对象,但对象不是字符串,这就是为什么你不能做第二个代码。

我喜欢这样想:狗是动物,可以表现得像动物,但动物不是狗。

好消息here

答案 2 :(得分:0)

从技术上添加一个条款,以@FunctionR

回答
Strings are Objects but Objects are not Strings

Objects可以是String

ObjectString的基类。所以你可以在两个方向上施展。

例如,

Object a = null;
String s = "";

a = s;
s = (String)a;

所以String可以是Object

但在List<Object>List<String>

你应该这样做

List<Object> myObjList = new ArrayList<Object>();
List<String> myStringList = (List) myObjList;