如果我声明一个我真正知道的列表“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!
答案 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)
答案 2 :(得分:0)
从技术上添加一个条款,以@FunctionR
Strings are Objects but Objects are not Strings
但Objects
可以是String
Object
是String
的基类。所以你可以在两个方向上施展。
例如,
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;