键入将对象转换为任何Collection类型

时间:2016-09-14 05:56:24

标签: java oop collections

我们最近在代码中遇到了一个与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

这不会引发运行时异常吗?有人能指出正确的方向,为什么这段代码没有引发异常?

2 个答案:

答案 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");
}