2015-05-12 4 views
11

Ich kann nicht verstehen, warum die Methode2 nicht kompiliert, während Methode1 kompiliert. Ich bin mit Eclipse mit JavaSE 1.7 und ich bekam die folgende Fehlermeldung auf method2:Warum erweitert <T Enum <T> & SomeInterface> kompilieren, aber nicht <T erweitert 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; 
    } 
} 

Antwort

16

Wenn Sie in JLS 8.1.2 an der Syntax für Typ-Parametergrenzen aussehen werden Sie sehen:

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType {AdditionalBound} 

AdditionalBound: 
    & InterfaceType 

Mit anderen Worten, nur der erste Typ kann eine Klasse sein - der Rest muss Schnittstellen sein.

Abgesehen von allem anderen verhindert dies, dass mehrere Klassen angegeben werden.

Es spiegelt auch die Art und Weise, wie beim Deklarieren einer Klasse, müssen Sie die Klasse, die es zuerst erstreckt, dann die Schnittstellen es implementiert - nicht umgekehrt.

+5

von Sekunden geschlagen. * Skeet! * \ * Schüttelt die Faust * – Radiodef

5

Nach den 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 

in Ihrem Beispiel Da method2 die Schnittstelle SomeInterface ersten, zeigt es den Compiler-Fehler

Verwandte Themen