4

我指的是这个java docs如果其中一个边界是一个类,则必须首先指定它。我觉得它应该允许以任何顺序。

为什么java有这样的限制?这背后有什么具体原因吗?

多重界限

前面的示例说明了使用具有单个边界的类型参数,但类型参数可以具有多个边界:

具有多个边界的类型变量是边界中列出的所有类型的子类型。如果其中一个边界是一个类,则必须首先指定它。例如:

Class A { /* ... */ } 
interface B { /* ... */ }
interface C { /* ...
 */ }

class D <T extends A & B & C> { /* ... */ }

如果未首先指定 bound A,则会出现编译时错误:

 class D <T extends B & A & C> { /* ... */ }  // compile-time error ,but why ?
4

4 回答 4

3

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

鉴于此,语言设计者决定必须首先在边界中列出该类(如果它存在的话)。实际上并没有什么深刻的原因——编译器可以很好地应对没有排序的唯一一类限制——但它确实使事情更容易教授,因为有一个简单的规则:如果你使用的是一个类作为一个泛型类型绑定,把它放在第一位

于 2012-10-29T07:49:04.790 回答
1

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

如果T是一个类,那么它将如下所示:

public class T extends A implements B, C {

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

于 2012-10-29T07:59:57.513 回答
0

JLS # 4.4. Type Variables

每个声明为类型参数的类型变量都有一个界限。如果没有为类型变量声明边界,则假定为 Object。如果声明了边界,则它包括:

  • 单个类型变量T,或
  • 一个类或接口类型T,可能后跟接口类型I1 & ... & In
于 2012-10-29T07:19:58.660 回答
0

我会说,"A type variable with multiple bounds is a subtype of all the types listed in the bound."似乎Java要求您在类声明中指出extends First,这就是原因。(另一方面,一个类只能扩展另一个类)

于 2012-10-29T07:38:21.857 回答