像这样的声明:
class A<X extends Number & List> { }
是允许的。而这样的声明是不允许的。
class A<? extends Number & List> { }
关于为什么 Java 限制我们这样做,有什么合乎逻辑的解释吗?
& 两者之间的实际区别是什么
<T extends Number>
& <? extends Number>?
像这样的声明:
class A<X extends Number & List> { }
是允许的。而这样的声明是不允许的。
class A<? extends Number & List> { }
关于为什么 Java 限制我们这样做,有什么合乎逻辑的解释吗?
& 两者之间的实际区别是什么
<T extends Number>
& <? extends Number>?
如果您使用<? extends Number & List>
,那么您将无法使用类型参数做任何事情。那就完全没用了。
同样,? extends Number
当您不需要引用扩展 number 的类型并且不需要给它命名时,让您处理特殊情况。
类型参数的全部意义T
在于您可以将其用作类中的类型。那里的通配符甚至意味着什么?如果你不能在任何地方使用它,为什么还要有一个类型参数呢?
泛型类和接口声明需要类型参数,例如 T 或 U。 ? 是一个通配符,更好地用于本身是通用的方法参数:
class Foo<T extends Number & List> {
void doStuff(List<T> items) {
// ...
}
void doMoreStuff(List<? extends OutputStream> streams) {
// ...
}
}
doStuff() 表示它想要对List<T>
Foo 类的类型参数进行操作,其中 T 是类型参数。所以:
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>
等的东西。