java类型将对象强制转换为任何集合类型
我们最近在代码中遇到了一个bug,它基本上与OOPs概念有关
class ABC
{
String a;
ABC(){
a = "abc";
}
}
public class Main {
static Object listABC() {
List<ABC> listOfABC = new ArrayList<>();
listOfABC.add(new ABC());
return listOfABC;
}
public static void main(String[] args) throws java.lang.Exception {
List<Long> listLong = (List) Main.listABC();
System.out.println(listLong.get(0));
}
}
Output: ABC@642c39d2
这不应该引发运行时异常吗?有人能给我指出正确的方向吗?为什么这段代码不会引发异常
# 1 楼答案
泛型类型将被擦除,并且在您的示例中,关于它们的信息在运行时不再存在。它们只是编译时辅助工具。演员名单<;T>;to List也会在编译时丢弃有关类型的信息,尽管它仍然是有效的强制转换
因此,只要你在每一步都进行法律强制转换,它就会很好地编译。在运行时,列表中关于类型的信息将消失在此处
如果您试图将get(0)强制转换为Long,那么您将得到一个classcastexception,因为该项本身是ABC
# 2 楼答案
答案很简单。泛型是编译时组件,以确保编译时兼容性。泛型在编译后消失,因此在运行时不再存在
由于
Object listABC
确实返回了一个List
,所以(List) Test.listABC();
不会抛出异常,因为它实际上返回了一个List
是有效的您可以将它分配给
List<Long> listLong
,因为在运行时listLong
不再知道它是Long
泛型的因此,即使看起来是错误的,这也是有效的可执行代码
还有一个唯一的原因是有一个
PrintStream#println(Object)
方法,否则您会得到一个Exception
,因为您试图用错误的类型调用它,如下面的示例所示O/p