2016-12-21 3 views
2

Ich bin neu in Generics und zu versuchen, zu verstehen, warum dieser Code kompiliert:Java Generics Codefehler

public Collection<Class<Subclass>> testFunction() { 

    return Collections.singleton(Subclass.class); 
} 

Und dieser Code nicht:

public Collection<Class<? extends SuperClass>> testFunction() { 

    return Collections.singleton(Subclass.class); 
} 

Meine SubClass wie folgt aussieht:

+1

beide sollten gut kompilieren (Java 8), die angegebene Frage bezieht sich nicht auf dieses Problem – Andrew

+0

@Eran es könnte von der Java-Version abhängen, die Sie verwenden, dh wenn der Typ Inferenz korrekt funktioniert Collections. Singleton (Integer.class); 'sollte eine' Collection > 'aber wenn nicht (und ältere Compiler hatten hier Probleme), erhalten Sie einen Typkonflikt. – Thomas

+0

@Eran Auf eclipse-neon, mit jdk 8 gibt es die folgende Fehlermeldung: Typenkonflikt: kann nicht konvertiert von Set > in Sammlung > – Vaibhav

Antwort

3

Die obigen kompiliert fein mit Java8:

class SuperClass { } 
class Subclass extends SuperClass{ } 

class Test { 
    public Collection<Class<? extends SuperClass>> testFunction() { 
    return Collections.singleton(Subclass.class); 
    } 
} 

Der Punkt ist: mit Java , Typinferenz wurde stark überarbeitet und verbessert.

Also meine rate hier ist: das kompiliert nicht für Sie, weil Sie Java 7 verwenden; wo einfach gesagt, der Compiler war nicht "gut genug", um solche Art von Code richtig zu lösen.

+0

Hier ist das Problem, dem ich gegenüberstand. Dein Code kompiliert jetzt auch für mich auf java8. Frühere Eclipse hat das Projekt nicht mit dem Java8-Compiler erstellt, daher war der Fehler dort. – Vaibhav