如果其中一个边界是类,则必须首先在java泛型中指定它。为什么?

时间:2012-10-29 07:16:52

标签: java generics inheritance type-parameter

我指的是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 ?

4 个答案:

答案 0 :(得分:3)

首先,那里只能有一个班级;每个Java类(除了java.lang.Object,这是一个特殊情况作为层次结构的根)只能从一个其他类继承。可以有多个接口,但最多只有一个类。这极大地简化了类型层次结构和对象构建过程的处理。

鉴于此,语言设计者决定必须首先在边界中列出类(如果它存在的话)。实际上没有深层次的理由 - 编译器可以在没有排序的情况下强制执行唯一的一类限制 - 但它确实使教学更容易,因为有一个简单的规则:如果你是使用类作为泛型类型绑定,首先将其放在

答案 1 :(得分:1)

他们可能只是将接口分组在一起,与类分开。

如果T是一个类,那么它看起来如下:

public class T extends A implements B, C {

但在泛型中,没有implements,只有extends。因此,约束可能只是让我们首先列出类本身,然后由于缺少关键字implements而列出接口。

答案 2 :(得分:0)

JLS # 4.4. Type Variables

声明为类型参数的每个类型变量都有一个绑定。 如果没有为类型变量声明绑定,则假定为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,这是原因。 (另一方面,一个类只能扩展另一个类)