Generics Funktionsaufruf nicht kompilieren in Java 8 Erweiterung mehrerer Schnittstellen

8

Ausführen von Java 1.8 JavaSE-1.8 (jdk1.8.0_20)

Diese Klasse:

%Vor%

gibt den Kompilierfehler:

Die Methode DoNothing () im Typ SimpleQuestion ist nicht anwendbar für die Argumente ()

Warum das und nicht DoNothing2,3 und 4?

    
user2051552 03.10.2014, 21:01
quelle

1 Antwort

4

Die Fehlermeldung scheint sich auf einen Fehler des in Abschnitt 18.5.1 der Spezifikation .

Für DoNothing geht der Algorithmus wie folgt vor (unter Verwendung der Terminologie aus dem obigen Link):

  • Die Typparameter sind

    P1 = X

    P2 = T extends Interface2<X> & Interface1

    und ich werde a1 und a2 für die entsprechenden Inferenzvariablen verwenden.

  • Die anfängliche gebundene Menge ist

    B0 = {a1 <: Object, a2 <: Interface2<a1>, a2 <: Interface1}

  • Es gibt keine Argumente, daher werden an dieser Stelle keine zusätzlichen Grenzen hinzugefügt (B2 = B0).

  • Es gibt eine Abhängigkeit von a2 auf a1, also versuchen wir zuerst a1 aufzulösen. Es hat eine richtige obere Grenze von Object, also instanziieren wir es dazu. Die Einbindung von a1 = Object beinhaltet das Hinzufügen der gebundenen

    a2 <: Interface2<Object>

  • Als nächstes lösen wir a2 auf. Dies hat jetzt zwei richtige obere Grenzen, also instanziieren wir a2 in ihr glb:

    a2 = Interface2<Object> & Interface1

  • Jede Variable verfügt jetzt über eine Instanziierung, sodass die Auflösung erfolgreich war.

Daher sollte im Gegensatz zur Fehlermeldung der Aufruf von DoNothing anwendbar sein. Dies scheint ein Fehler in Ihrem Java-Compiler zu sein.

    
Mark Brown 06.10.2014 15:25
quelle