我有一个返回的方法List<Super>.说
List<Super> myMethod();
调用该方法时,我想投返回的列表List<Sub>,了解其运行时类型将是一个List的Sub.
我知道这是List<Sub> subs = (List<Sub>) myMethod()行不通的,因为泛型是不变的.
但是,List<? super Sub> subs = myMethod()工作,编译时类型变为List<Object>,所以subs.get(0).mySubMethod()不起作用.
我最终得到的是我必须明确地将其视为 ((Sub) subs.get(0)).mySubMethod()
如果没有对每个元素进行显式转换,我该怎么做呢?
最短的版本是:
List<Sub> subs = (List) myMethod();
Run Code Online (Sandbox Code Playgroud)
List是一种"原始类型"; 您可以转换List为任何List<...>没有演员阵容.
请注意,这是以一种根本不正确的方式绕过类型系统; 列表是作为一个ArrayList<Super>(或类似的)构造的,所以实际上错误的是欺骗编译器让你用类型的引用引用List<Sub>它,即使所有列表元素都是类型的Sub.(对于msandiford上面的较长版本也是如此;它可能看起来更加通用,但它实际上只是做同样根本不正确的事情的另一种方式.)
但是,由于类型擦除,你通常可以逃脱它.
一种正确的方法是使方法本身通用:
<T extends Super> List<T> myMethod(final Class<T> clazz) {
final List<T> ret = Collections.checkedList(new ArrayList<T>(), clazz);
// ... add elements to ret ...
return ret;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |