我指的是java docs。 如果其中一个边界是一个类,则必须先指定。我觉得应该允许任何顺序。
为什么java有这样的限制?这背后有什么具体原因吗?
多个边界
前面的例子说明了使用带有a的类型参数 单个绑定,但类型参数可以有多个边界:
具有多个边界的类型变量是所有类型的子类型 在界限中列出。如果其中一个边界是一个类,它必须是 先指定。例如:
Class A { /* ... */ }
interface B { /* ... */ }
interface C { /* ...
*/ }
class D <T extends A & B & C> { /* ... */ }
如果未首先指定绑定A,则会出现编译时错误:
class D <T extends B & A & C> { /* ... */ } // compile-time error ,but why ?
答案 0 :(得分:3)
首先,那里只能有一个班级;每个Java类(除了java.lang.Object
,这是一个特殊情况作为层次结构的根)只能从一个其他类继承。可以有多个接口,但最多只有一个类。这极大地简化了类型层次结构和对象构建过程的处理。
鉴于此,语言设计者决定必须首先在边界中列出类(如果它存在的话)。实际上没有深层次的理由 - 编译器可以在没有排序的情况下强制执行唯一的一类限制 - 但它确实使教学更容易,因为有一个简单的规则:如果你是使用类作为泛型类型绑定,首先将其放在。
答案 1 :(得分:1)
他们可能只是将接口分组在一起,与类分开。
如果T
是一个类,那么它看起来如下:
public class T extends A implements B, C {
但在泛型中,没有implements
,只有extends
。因此,约束可能只是让我们首先列出类本身,然后由于缺少关键字implements
而列出接口。
答案 2 :(得分:0)
声明为类型参数的每个类型变量都有一个绑定。 如果没有为类型变量声明绑定,则假定为Object。如果声明了绑定,则它包含:
T
或T
可能后跟接口类型I1 &
... & In
答案 3 :(得分:0)
我会说"A type variable with multiple bounds is a subtype of all the types listed in the bound."
并且似乎Java要求您在类声明中指出extends First,这是原因。 (另一方面,一个类只能扩展另一个类)