2013-04-28 60 views
1

我有点困惑与下面的代码。问题是代码看起来与列表< T>具有与T相同的类型。 考虑方法makeList接收类型DTOInt的参数< T>并返回列表< T>(列表T)。 类DTO执行“T getData()方法” DTOInt < T>的,所以我们必须DTOInt接口具有一般定义t内是返回类型getData()方法的。铸造普通的T列出<T>

所以,内部makeList方法我做方法的getData()返回的对象(其是T形)的明显铸造成列表< T>。 它编译和运行良好。

关于编制了明确的 - 有一个明显的铸件,但是当它运行怎么不失败,抛出ClassCastException上铸造线在makeList()方法?

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())); 
    } 
} 

回答

3

这在运行时起作用的原因是因为泛型在运行时不存在,它们纯粹在编译器端实现。在编译过程中,泛型被一个名为“type erasure”的进程删除。

所有运行时发现的是,您的方法DTO.getData()正在返回List类型的结果。在视运行时的点 - - 这一结果是从makeList()方法,该方法返回返回List一样,所以运行时很高兴。

当然,这只适用于因为DTO确实返回List结果。如果你想创建一个二等

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

然后浇铸DTO2.getData()List结果的确会抛出异常。

+0

谢谢ignaZ! – Nemo 2013-04-28 11:48:05