将通用T转换为List <t> </t>

时间:2013-04-28 11:09:38

标签: java list generics

我对下面的代码感到有点困惑。问题是代码看起来与List&lt; T>与T的类型相同 考虑方法 makeList 接收类型为DTOInt的参数&lt; T&GT;并返回List&lt; T>(T列表)。 实现DTOInt的'T getData()方法'的类DTO&lt; T&gt;,所以我们有DTOInt接口有通用定义T,它是getData()方法的返回类型。

因此,在 makeList 方法内部,我明确地将方法 getData()的返回对象(T类型)转换为List&lt; T&GT ;. 它编译并运行良好。

关于编译它的清楚 - 有一个明显的转换,但是当它运行时如何在makeList()方法的转换线上使用ClassCastException失败?

interface DTOInt<T>{
    T getData(); 
}

class DTO implements DTOInt<List<List<String[]>>>{
    public List<List<String[]>> getData() {
        String[] arr = {"1.1","1.2","1.3"};
        String[] arr1 = {"2.1","2.2","2.3"};

        List<String[]> l = new ArrayList<String[]>();

        l.add(arr);
        l.add(arr1);

        List<List<String[]>> data = new ArrayList<List<String[]>> ();
            data.add(l);

        return data;
    }

}

public class Test {

    static <T> List<T> makeList(DTOInt<T> inp){
        T data = inp.getData();
        List<T> list = (List<T>) data;
        return list;
    }

    public static void main(String[] args) {
        System.out.println(makeList(new DTO()));
    }
}

1 个答案:

答案 0 :(得分:3)

这在运行时工作的原因是因为泛型在运行时不存在,它们纯粹在编译器端实现。在编译期间,通过称为“类型擦除”的过程删除泛型。

所有运行时都会看到您的方法DTO.getData()返回的类型List的结果。这个结果是从makeList()方法返回的,在运行时的角度来看,它也返回List,所以运行时很开心。

当然,这只有效,因为DTO确实会返回List结果。如果你要创建第二个类

class DTO2 implements DTOInt<Integer> { ... }

然后将DTO2.getData()的结果转换为List确实会引发异常。