如何使用List <Sub>作为List <Super>返回

ssg*_*gao 2 java generics

我有一个返回的方法List<Super>.说 List<Super> myMethod();

调用该方法时,我想投返回的列表List<Sub>,了解其运行时类型将是一个ListSub.

我知道这是List<Sub> subs = (List<Sub>) myMethod()行不通的,因为泛型是不变的.

但是,List<? super Sub> subs = myMethod()工作,编译时类型变为List<Object>,所以subs.get(0).mySubMethod()不起作用.

我最终得到的是我必须明确地将其视为 ((Sub) subs.get(0)).mySubMethod()

如果没有对每个元素进行显式转换,我该怎么做呢?

rua*_*akh 6

最短的版本是:

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)