逗号或带有多种有界类型的&符号?

时间:2015-03-05 05:06:40

标签: java types

在Java中,逗号和&符号在声明乘法有界类型时都有效吗?

class MyClass <T extends OtherInterface, SomeInterface>

class MyOtherClass <T extends OtherInterface & SomeInterface>

4 个答案:

答案 0 :(得分:45)

正如其他人所指出的那样:

class MyOtherClass <T extends OtherInterface & SomeInterface>

定义了一个乘法有界类型参数。如果您使用MyOtherClass,则必须为其提供同时实现OtherInterfaceSomeInterface的类型。

但是,定义了一个乘法有界类型参数:

class MyClass <T extends OtherInterface, SomeInterface>

它定义了一个带有两个类型参数的泛型。第一个必须实现OtherInterface。第二个可以是任何东西。它和

一样
class MyClass <T extends OtherInterface, U>

除了您将其命名为SomeInterface而不是U。 (惯例是类型参数通常是单个大写字母,或者有时是大写字母和数字或短大写标识符。但编译器并不关心。它不会看起来在标识符的形式,以确定你真的把它作为一个接口。)

答案 1 :(得分:2)

找到了这条规则:

多个边界

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

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

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

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

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

class D <T extends B & A & C> { /* ... */ }  // compile-time error

答案 2 :(得分:2)

<T extends B1 & B2 & B3>可能有多个界限,其中B2和B3应该是界面。 B1可以是简单的类或接口

答案 3 :(得分:1)

类型绑定定义中的逗号和符号表示不同的内容。

&符号表示您的类型参数是由&#39;&amp;&#39;加入的所有类型参数边界的子类型。正如您所料,类型参数边界列表必须遵守Java的多重继承规则 - 即,在最多一个类中,允许多个接口。

逗号是捕获的类型边界的分隔符 - 因此在您的示例中,它意味着您有两个单独的类型参数--T扩展了OtherInterface和SomeInterface,因此您必须像以下一样使用它:

new MyClass<OtherInterfaceSubtype, SomeInterfaceSubType>();

我猜这不是你想要的。