Kann jemand erklären, warum das JDK kompiliert 1.6, aber nicht in JDK 1.7, von dem ich die Fehlermeldung:Java 7, aber nicht Java 6: „ist nicht abstrakt und überschreibt nicht abstrakte Methode“
java: Beispiel ist nicht abstrakt und überschreibt nicht die abstrakte Methode compareTo (java.lang.Object) in java.lang.Comparable?
import java.util.concurrent.*;
public class Example implements ScheduledFuture
{
@Override public long getDelay(TimeUnit unit){ return 0; }
@Override public int compareTo(Delayed o) { return 0; }
@Override public boolean cancel(boolean mayInterruptIfRunning) { return false; }
@Override public boolean isCancelled() { return false; }
@Override public boolean isDone() { return false; }
@Override public Object get() throws InterruptedException, ExecutionException { return null; }
@Override public Object get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return null; }
}
Zu Ihrer Information, die Methoden in dieser Klasse werden von IntelliJ erzeugt wird, nachdem nur die Klassendeklaration zu schreiben.
Die Fehlermeldung zeigt an, dass der Compiler erfordert, dass die Klasse eine compareTo-Methode deklariert, die einen typisierten Object
-Parameter akzeptiert und diese Klasse eine Delayed
übernimmt. Allerdings ist die ScheduledFuture
Schnittstelle als Erweiterung Delayed
definiert, die wiederum Comparable<Delayed>
erstreckt, so scheint mir alles in Ordnung zu sein.
Wenn ich die Erklärung nur
private class Example implements ScheduledFuture<Object>
zu
ändern es kompiliert.Ich vermute, es hat irgendwie mit Typ löschen zu tun, aber ich kann es nicht wirklich erklären, um mich zu befriedigen.
Ich an Ihrer Stelle würde die javadoc für ScheduledFuture von 1.6 und 1.7 nachschlagen und überprüfen, was sich geändert hat. – Ingo
Es ist mir passiert, dass Java 6 die Vererbung von Rohtypen aus parametrisierten Klassen nicht verhindert, während 7 tut – fglez