2013-07-29 6 views
8

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.

+1

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

+0

Es ist mir passiert, dass Java 6 die Vererbung von Rohtypen aus parametrisierten Klassen nicht verhindert, während 7 tut – fglez

Antwort

10

Ich weiß nicht wirklich, warum sich das Verhalten zwischen Java 6 und Java 7 ändert (haben Sie das mit anderen Compilern verifiziert?

Aber ich kann Ihnen sagen, warum compareTo(Delayed) tut nichtcompareTo(Object) implementieren, wenn Sie ScheduledFuture erweitern:

von ScheduledFuture verwenden, sind Sie a raw type verwenden, was bedeutet, dass alle Vorkommen von Generika ziemlich ignoriert werden deine Klasse. Das bedeutet, dass Sie jetzt Comparable (und nicht mehr Comparable<Delayed>, was wiederum sind der Umsetzung bedeutet, dass Sie compareTo(Object) (die Löschung von Comparable<Delayed>.compareTo() implementieren müssen), aber Sie compareTo(Delayed) implementieren

Denken Sie daran:. Raw-Typen sollen nur für die abwärts~~POS=TRUNC. vermeiden sie in neuem Code auf allen Kosten, sie tun böse Dinge!

Wenn Sie Ihre extends Klausel ScheduledFuture<Object> ändern Sie „Opt-in“ auf das Generika-System und der Compiler schließlich realisiert (zB " erlaubt zu realisieren ") dass deine compareTo(Delayed) ist in der Tat die richtige Implementierung der Comparable<Delayed> Schnittstelle.

+1

+1: Dies wird definitiv durch die Verwendung von Rohtypen verursacht, was bedeutet, dass alle Generika ignoriert werden. –

+0

Ich habe nur die Java HotSpot Compiler 1.6.0_43 und 1.7.0_25 verwendet. –

+0

@ThomasLarssonKron: "HotSpot" ist die JVM, es ist nicht der Compiler. Sie haben wahrscheinlich 'javac' aus diesen Java-Versionen verwendet. –

Verwandte Themen