1

我对下面的代码有点困惑。问题是代码看起来 List<T> 与 T 具有相同的类型。考虑到方法makeList接收 DTOInt<T> 类型的参数并返回 List<T>(T 列表)。类 DTO 实现了 DTOInt<T> 的“T getData() 方法”,因此我们有 DTOInt 接口具有通用定义 T,它是 getData() 方法的返回类型。

因此,在makeList方法内部,我将方法getData()返回的对象(T 类型)明显转换为 List < T>。它编译和运行良好。

关于编译它很清楚 - 有一个明显的转换,但是当它运行时它不会在 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()));
    }
}
4

1 回答 1

3

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

运行时所看到的只是您的方法DTO.getData()正在返回 type 的结果List。这个结果是从makeList()方法返回的,从运行时的角度来看,它List也返回 a,所以运行时很高兴。

当然,这只有效,因为它DTO真的返回了一个List结果。如果您要创建第二个班级

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

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

于 2013-04-28T11:18:53.600 回答