Frage

Im folgenden Test stellt die TesterClass eine Einschränkung für die Beziehung zwischen den beiden Typparametern auf. Die Methode func2 () scheint diese Einschränkung zu brechen, und ich erwarte, dass sie irgendwo einen Tippkompilierungsfehler (nach der Definition von Func2 oder wenn die Klasse mit einem anderen Parameter als zweiter Parameter als Zeichenfolge verwendet wird) verursacht, aber nicht!

Wenn ich Func2 aufrufe und das Ergebnis in einer entsprechend typisierten Variablen speichere, schlägt die Kompilierung (auf dem Typ dieser Variablen) fehl. Das Gleiche und das Speichern in einem allgemeineren Typ (wie z. B. Objekt) ist jedoch erfolgreich, obwohl der Rückgabetyp der Funktion in beiden Fällen den gleichen Typ haben sollte (vor dem Up-Cast).

Was ist denn hier los?

Vielen Dank!

public class TestGenerics {
    public static class ParamedType<T> {}


    public class TesterClass<A extends ParamedType<B>, B> {
        public TesterClass<A, B> func() {
            return new TesterClass<A, B>();
        }

        public TesterClass<A, String> func2() {
            return new TesterClass<A, String>();
        }
    }

    public Object test() {
        // How can I use these type parameters? Doesn't .func2 now have an invalid return type?
        TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();

        //TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
        Object res = testClass.func2(); // Compiles
        return res;
    }
}

BEARBEITEN: Dies nicht Kompilieren Sie in Javac (Versionen unten). Ich benutze Eclipse und versuche herauszufinden, was der Compiler ist, der tatsächlich läuft. Werde dich auf den neuesten Stand bringen. Kann ein JDT -Fehler (Eclipse Compiler) sein.

Ich habe einen Fehlerbericht für Eclipse's JDT eröffnet:https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

War es hilfreich?

Lösung

Einfache Antwort: Es kompiliert nicht, zumindest unter Javac 1.7:

Test.java:10: type parameter A is not within its bound
    public TesterClass<A, String> func2() {
                       ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
Test.java:11: type parameter A is not within its bound
        return new TesterClass<A, String>();
                               ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
2 errors

Sie haben nicht gesagt, unter was Sie es zusammengestellt haben - ich vermute, dass Ihr Java -Compiler einen Fehler enthält.

Andere Tipps

Anscheinend ist dies ein Eclipse -Fehler in jdt.core. Ich habe einen Fehlerbericht bei eröffnet https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top