我无法理解为什么method2不编译而method1编译。 我使用Eclipse和JavaSE 1.7,我在method2上遇到以下错误:
此行有多个标记
类型Enum< T>不是一个界面;它不能被指定为有界参数
- 的类型
绑定不匹配:类型T不是有界参数的有效替代< E extends Enum< E>> Enum< E>
public class Test {
public interface SomeInterface {
}
public static <T extends Enum<T> & SomeInterface> T method1() {
return null;
}
public static <T extends SomeInterface & Enum<T>> T method2() {
return null;
}
}
答案 0 :(得分:16)
如果你看一下JLS 8.1.2中类型参数范围的语法,你会看到:
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
AdditionalBound:
& InterfaceType
换句话说,只有指定的 first 类型可以是一个类 - 其余的都必须是接口。
除此之外,还可以防止指定多个类。
它还反映了在声明一个类时,你必须首先将它扩展的类,然后是它实现的接口 - 而不是反过来。
答案 1 :(得分:5)
根据docs:
具有多个边界的类型变量是绑定中列出的所有类型的子类型。如果其中一个边界是类,则必须首先指定它。例如:
Class A { /* ... */ }
interface B { /* ... */ }
interface C { /* ... */ }
class D <T extends A & B & C> { /* ... */ }
如果未首先指定绑定A,则会出现编译时错误:
class D <T extends B & A & C> { /* ... */ } // compile-time error
因为在您的示例中method2
首先具有接口SomeInterface
,所以它显示编译器错误