在Java中,逗号和&符号在声明乘法有界类型时都有效吗?
class MyClass <T extends OtherInterface, SomeInterface>
class MyOtherClass <T extends OtherInterface & SomeInterface>
答案 0 :(得分:45)
正如其他人所指出的那样:
class MyOtherClass <T extends OtherInterface & SomeInterface>
定义了一个乘法有界类型参数。如果您使用MyOtherClass
,则必须为其提供同时实现OtherInterface
和SomeInterface
的类型。
但是,不定义了一个乘法有界类型参数:
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>();
我猜这不是你想要的。