【发布时间】:2019-11-27 17:33:18
【问题描述】:
我发现反复出现的解释是上限通配符relaxes the restrictions of types that a type parameter can accept. 这个概念也适用于有界泛型,例如:
static <T extends Number> void gMethod (ArrayList <T> list) {}
此方法的泛型在指定时将接受 Number 类型的对象或其任何子类:
ArrayList <Integer> intList = new ArrayList();
gMethod(intList); // allowed
进一步详细说明,有界到 Number 的泛型也将接受 Number 或其任何子类的类型参数:
class Thing <T extends Number> {}
Thing <Number> numThing = new Thing();
Thing <Integer> intThing = new Thing();
Thing <Double> dubThing = new Thing(); // All three instances work
鉴于此,我可以看到使用上限通配符与有界泛型的唯一好处是,可以在不依赖已由类或方法声明的类型参数的情况下声明上限通配符类型参数。我还缺少什么更重要的好处吗?
【问题讨论】:
-
你没有展示任何有界通配符的例子......
-
是的,它只是一个您不想麻烦命名的参数。无需发明一个只会使用一次的名称。
-
如果有人想知道,这似乎是使用通配符的主要好处(如果不是唯一的话)。我只是碰巧在弄乱上限通配符时遇到了这个问题
-
我看到了更多原因,但我不确定它们是否算作答案。 1)这取决于你想用这个
list做什么。如果这是通配符,你能把东西放进去吗? 2)如果你真的不关心T(我的意思是你不会在方法内部使用任何变量作为T类型),那么有一个一般性的建议是摆脱它并使用wildcard3)通配符可以有一个单一的界限,而类型引用可以有更多(当原始/擦除类型派生时这件事)4)当我已经有一个类型参数并且没有时,我发现自己可以引入通配符想要 -
介绍另一个。例如:
public <T extends CoolInterface> void(List<? extends T>)。我可以使用List<R extends T>,但这意味着我需要再引入一个类型参数,这可能对调用者来说意义不大。如前所述,我真的不知道这是否能回答您的问题。
标签: java generics wildcard bounded-wildcard