这样的声明:
class A<X extends Number & List> { }
是允许的。而这样的声明是不允许的。
class A<? extends Number & List> { }
对于为什么 Java 限制我们这样做有任何合乎逻辑的解释吗?
& 之间的实际区别是什么
<T extends Number>
& <? extends Number>?
如果您使用
<? extends Number & List>
,那么您将无法使用类型参数进行 do 任何操作。 那就完全没用了。
同样,
? extends Number
可以让你处理特殊情况,当你不需要引用扩展数字的类型,并且不需要给它命名时。
像
T
这样的类型参数的全部意义在于,您可以将其用作类内的类型。那里的通配符到底意味着什么?如果你不能在任何地方使用它,为什么还要有类型参数呢?
通用类和接口声明需要类型参数,例如 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>
等类型的内容。