Java 7, aber nicht Java 6: "ist nicht abstrakt und überschreibt nicht die abstrakte Methode"

8

Kann jemand erklären, warum dies in JDK 1.6 kompiliert wird, aber nicht in JDK 1.7, von dem ich die Fehlermeldung bekomme:

  

java: Beispiel ist nicht abstrakt und überschreibt nicht die abstrakte Methode compareTo (java.lang.Object) in java.lang.Comparable?

%Vor%

Zu Ihrer Information werden die Methoden in dieser Klasse von IntelliJ nach dem Schreiben nur der Klassendeklaration generiert.

Die Fehlermeldung weist darauf hin, dass der Compiler erfordert, dass die Klasse eine compareTo-Methode deklariert, die einen Object typed-Parameter akzeptiert, und diese Klasse ein Delayed akzeptiert. Die Schnittstelle ScheduledFuture ist jedoch so definiert, dass Delayed erweitert wird, was wiederum Comparable<Delayed> erweitert, so dass mir alles in Ordnung zu sein scheint.

Wenn ich nur die Deklaration zu

ändere %Vor%

es kompiliert.

Ich vermute, es hat etwas mit Art-Löschen zu tun, aber ich kann es nicht wirklich erklären, um mich selbst zu befriedigen.

    
Thomas Larsson Kron 29.07.2013, 10:37
quelle

1 Antwort

10

Ich weiß nicht wirklich, warum sich das Verhalten zwischen Java 6 ändert und Java 7 (haben Sie das verifiziert? mit anderen Compilern? javac vs. Eclipse Compiler vs. was auch immer IDEA verwendet?).

Aber ich kann Ihnen sagen, warum compareTo(Delayed) nicht compareTo(Object) implementiert, wenn Sie ScheduledFuture erweitern:

Wenn Sie ScheduledFuture verwenden, verwenden Sie ein roher Typ , was bedeutet, dass alle Vorkommen von Generika in Ihrer Klasse ziemlich ignoriert werden. Das bedeutet, dass Sie jetzt Comparable (und nicht länger Comparable<Delayed> ) implementieren, was wiederum bedeutet, dass Sie compareTo(Object) (das Löschen von Comparable<Delayed>.compareTo() ) implementieren müssen, aber Sie implementieren compareTo(Delayed) .

Denken Sie daran: Raw-Typen sind aus Gründen der Abwärtskompatibilität nur . Vermeiden Sie sie in neuen Code um jeden Preis, sie tun böse Dinge!

Wenn Sie Ihre extends -Klausel in ScheduledFuture<Object> ändern, "melden" Sie sich an das Generikasystem an und der Compiler erkennt schließlich (dh "darf realisieren"), dass Ihre compareTo(Delayed) tatsächlich die richtige Implementierung ist der Schnittstelle Comparable<Delayed> .

    
Joachim Sauer 29.07.2013, 10:51
quelle