2015-05-12 163 views
11

我不明白爲什麼method2不編譯,而method1編譯。 我使用的Eclipse與JavaSE的1.7和我的方法2以下錯誤:爲什麼<T擴展Enum <T>&SomeInterface>編譯,但不是<T擴展SomeInterface&Enum <T>>?

Multiple markers at this line

  • The type Enum<T> is not an interface; it cannot be specified as a bounded parameter

  • Bound mismatch: The type T is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type 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; 
    } 
} 

回答

16

如果你看一下在JLS 8.1.2語法的類型參數的邊界,你會看到:

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType {AdditionalBound} 

AdditionalBound: 
    & InterfaceType 

換句話說,只有第一個指定的類型可以是一個類 - 其餘的都是接口。

除了別的以外,這可以防止指定多個類。

它也反映了在聲明一個類的時候,你必須先把它擴展的類,然後是它實現的接口 - 而不是相反。

+5

按秒毆打。 * Sk​​eet!* \ *搖動拳頭* – Radiodef

5

按照docs

A type variable with multiple bounds is a subtype of all the types listed in the bound. If one of the bounds is a class, it must be specified first. For example:

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

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

If bound A is not specified first, you get a compile-time error:

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

因爲在你的榜樣method2有接口SomeInterface第一,它顯示了編譯器錯誤

相關問題