这样的声明:
class A<X extends Number & List> { }
是允许的。不允许这样的声明。
class A<? extends Number & List> { }
有没有合理的解释为什么Java限制我们这样做?
&安培;
之间的实际区别是什么 <T extends Number>
& <? extends Number>?
答案 0 :(得分:3)
如果您使用<? extends Number & List>
,那么您将无法使用type参数执行任何操作。它完全没用。
类似地,? extends Number
允许您在不需要引用扩展数字的类型时处理特殊情况,并且您不需要为其命名。
答案 1 :(得分:1)
像T
这样的类型参数的重点是,您可以将其用作类中的类型。那里的通配符甚至意味着什么?如果你不能在任何地方使用它,为什么还要有一个类型参数?
答案 2 :(得分:0)
泛型类和接口声明需要类型参数,例如T或U.是一个通配符,更适用于本身通用的方法参数:
class Foo<T extends Number & List> {
void doStuff(List<T> items) {
// ...
}
void doMoreStuff(List<? extends OutputStream> streams) {
// ...
}
}
doStuff()表示它想要在List<T>
上操作,其中T是类Foo上的类型参数。所以:
class Weird extends Number implements List {
//
}
Foo<Weird> f = new Foo<Weird>();
f.doStuff(...); // wants a List<Weird>
如果我们在f上调用了doMoreStuff(),我们就可以提供List<OutputStream>
,List<FilterOutputStream>
,List<ByteArrayOutputStream>
等类型的东西。