我有一个类,它依赖泛型在内部绑定(bind)类型。
class C<T1, T2 extends T1> {
T1 e1;
T2 e2;
/* stuff */
}
在我的代码中我知道,而 c.e1
和c.e2
可能没有同一个类,c.e2
是 c.e1
类的子类的实例.
我需要创建一个List
其中c
s,并且这些元素不会共享公共(public)基类。尽管如此,我还是想保留 List
的每个元素属性之间有界限。
理想情况下,我想创建一个 List<C<?, ? extends ...>>
“但是”我不知道任何语法来指定此行为。
并使用 List<C<?, ?>>
在我看来,我丢失了泛型类型。
进行此收集的正确方法是什么?
最佳答案
自 T2
受 C
声明的限制,您将始终保留它是 T1
的子类型这一事实即使您使用通配符。即它是 C
的特征第二个类型参数扩展了第一个类型参数。
所以你可以使用List<C<?, ?>>
.
当您尝试将泛型参数绑定(bind)到类型变量时,您已经可以看到这是有效的。例如:
public static <T1, T2> void m(List<C<T1, T2>> list) { ... }
^^-- Bound mismatch
您需要使用:
public static <T1, T2 extends T1> void m(List<C<T1, T2>> list) {...}
或者:
public static <T1> void m(List<C<T1, ? extends T1>> list) {...}
让编译器高兴。
关于java - 在列表元素中保留泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48460389/