2016-10-28 79 views
0

我正在铸造列表<T>至列表<字符串>。列表的任何元素上的getClass()方法返回List的元素的实际类,即T而不是String。不应该Java返回字符串而不是实际的类,因为列表被转换为字符串列表?铸造列表<T>至列表<String>类型

public cast (List<?> unsortedList) { 
    List<String> unsortedListOfPrimitives = (List<String>)unsortedList; 
    System.out.println(unsortedListOfPrimitives.get(0).getClass()); 
} 


cast(List<BigDecimal> unsortedList); 

Output : java.math.BigDecimal 
+1

与C++不同,Casting不会改变Java中的对象。你只是告诉Java T类型是“String”。如果你有'列表 aList =新列表()'和后面的''列表 sList =(列表)aList;','sList'是同一个对象,你刚才的类型是错误的。 –

+0

如果你举了一个具体的例子,它会有所帮助。 –

+0

谢谢,托马斯。我编辑了这个问题来包含一个例子。 –

回答

1

Java泛型并不总是按照您期望的方式工作。

具体而言,将泛型转换为特定类型实际上并不会改变对象,并且在执行此操作时可能会得到不安全的结果,并且不能100%确定您拥有正确的结果。

因此,您投到List<String>的对象实际上仍然是包含BigDecimal条目的列表,您刚刚对它进行了误操作。

这是Java是类型不安全的情况下 - 就像投ObjectInteger是类型不安全的(但在运行时,不安全ObjectInteger强制转换将失败的施法时间,而一般的强制转换不会直到后来才失败。)

+0

如果忽略编译时警告只是不安全的。 – shmosel