我有一个通用接口
到目前为止,我已经尝试过以下方法:
interface ListList<E> extends List<List<E>>
。由于某些原因,我无法将ListList<? super T>
转换为List<List<? super T>>
。有没有办法做到这一点,为什么它不起作用?到目前为止,我已经尝试过以下方法:
- 简单的赋值语句,通过这种方式我成功将
ListList<? super T>
赋给了List<? extends List<? super T>>
(1),但是当我尝试将ListList<? super T>
赋给List<List<? super T>>
时,我得到了编译时错误“不兼容的类型”(1.1)。 - 显式类型转换,由于相同的编译时错误,它不起作用(2)。
- 将其强制转换为原始类型
ListList
,它可以工作(3),但我不喜欢使用原始类型。 - 将
ListList<? super T>
中的所有元素添加到List<? extends List<? super T>>
中,它可以工作(4),但我需要更通用的解决方案,不仅适用于ListList<E>
,而且适用于任何泛型类型。
ListList<? super T> var = new ArrayListList<>();
List<? extends List<? super T>> work = var; // (1)
List<List<? super T>> notWork = var; // (1.1)
List<List<? super T>> explicit = (List<List<? super T>>) var; // (2)
List<List<? super T>> raw = (ListList) var; // (3)
List<List<? super T>> copy = new ArrayList<>(); // (4)
copy.addAll(var); // (4)
我本来以为 ListList<? super T>
应该是 List<List<? super T>>
,但实际上它是 List<? extends List<? super T>>
。我需要知道为什么以及如何在不使用原始类型和复制元素的情况下将其转换为 List<List<? super T>>
。
? super T
更改为普通的T
才能使其编译。如果我将它们更改为? extends T
,则相同的错误会再次出现。 - rgettman