我们最近在代码中遇到了一个与OOP概念基本相关的错误。
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));
}
}
输出:ABC @ 642c39d2
这不会引发运行时异常吗?有人能指出正确的方向,为什么这段代码没有引发异常?
答案 0 :(得分:7)
通用类型被删除,在您的示例中,有关它们的信息在运行时不再存在。他们只是编译辅助工具。投射列表&lt; T&gt; “列表”也会在编译时丢弃有关类型的信息,尽管它仍然是有效的演员。
因此,只要您在每一步都进行合法演员表,那么它就可以正常编译。在运行时,列表中的类型信息已经消失。
如果您尝试将get(0)强制转换为Long ,那么会得到classcastexception,因为该项目本身就是ABC。
答案 1 :(得分:3)
答案很简单。泛型是编译时组件,以确保编译时兼容性。编译后泛型已经消失,因此在运行时不再存在。
当from tkinter import*
确实返回Object listABC
时,List
不会抛出异常,因为它有效,因为它实际上返回(List) Test.listABC();
。
您可以将其分配给List
,因为在运行时List<Long> listLong
不再知道listLong
通用了。
因此,即使它看起来不对,也是有效的可执行代码。
这也是唯一的原因是有一个Long
方法,否则你会得到PrintStream#println(Object)
,因为你试图用错误的类型调用它,如下所示示例
Exception
O / P
static Object listABC() {
List<Test> listOfABC = new ArrayList<>();
listOfABC.add(new Test());
return listOfABC;
}
public static void main(String[] args) throws java.lang.Exception {
List<Long> listLong = (List) Test.listABC();
System.out.println(listLong.get(0));
test(listLong.get(0));
}
private static void test(Long longvalue) {
System.out.println("TEST");
}