为什么<t extends =“”enum <t =“”>&amp; SomeInterface&GT;编译,但不是<t extends =“”someinterface =“”&=“”enum <t =“”>&gt;?

时间:2015-05-12 14:57:18

标签: java generics enums type-bounds

我无法理解为什么method2不编译而method1编译。 我使用Eclipse和JavaSE 1.7,我在method2上遇到以下错误:

  

此行有多个标记

     
      
  • 类型Enum&lt; T&gt;不是一个界面;它不能被指定为有界参数

  •   
  • 绑定不匹配:类型T不是有界参数的有效替代&lt; E extends Enum&lt; E&gt;&gt; Enum&lt; E&gt;

  • 的类型   
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;
    }
}

2 个答案:

答案 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,所以它显示编译器错误