我对下面的代码感到有点困惑。问题是代码看起来与List< T>与T的类型相同 考虑方法 makeList 接收类型为DTOInt的参数< T>并返回List< T>(T列表)。 实现DTOInt的'T getData()方法'的类DTO< T>,所以我们有DTOInt接口有通用定义T,它是getData()方法的返回类型。
因此,在 makeList 方法内部,我明确地将方法 getData()的返回对象(T类型)转换为List< 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()));
}
}
答案 0 :(得分:3)
这在运行时工作的原因是因为泛型在运行时不存在,它们纯粹在编译器端实现。在编译期间,通过称为“类型擦除”的过程删除泛型。
所有运行时都会看到您的方法DTO.getData()
返回的类型List
的结果。这个结果是从makeList()
方法返回的,在运行时的角度来看,它也返回List
,所以运行时很开心。
当然,这只有效,因为DTO
确实会返回List
结果。如果你要创建第二个类
class DTO2 implements DTOInt<Integer> { ... }
然后将DTO2.getData()
的结果转换为List
确实会引发异常。