2013-07-29 8 views
8

これはJDK 1.6でコンパイルなぜ誰かが説明できますが、私はエラーメッセージが表示されませJDK 1.7で、そこから:のJava 7ではなくJavaの6:「抽象的ではなく、抽象メソッドをオーバーライドしない」

をjava:例は抽象メソッドではなく、java.lang.Comparableの抽象メソッドcompareTo(java.lang.Object)をオーバーライドしませんか?あなたの情報については

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; } 
} 

、このクラスのメソッドは、単にクラス宣言を書いた後のIntelliJによって生成されます。

エラーメッセージは、クラスがObject型付きパラメータを取るcompareToメソッドを宣言し、このクラスがDelayedを必要とすることをコンパイラが要求することを示します。 しかし、ScheduledFutureインターフェイスは、Delayedのように定義されており、順番にはComparable<Delayed>というように拡張されています。私はちょうどそれがコンパイル

private class Example implements ScheduledFuture<Object> 

に宣言を変更した場合

私はそれが何らかの形で消去と関係していると推測していますが、私は自分自身を満足させるためにそれを実際に説明することはできません。

+1

私はあなたのところでは、ScheduledFutureのjavadocを1.6と1.7から探し、何が変更されたかを確認します。 – Ingo

+0

Java 6では、パラメータ化されたクラスからの生の型継承を防ぐことはできませんでした。 – fglez

答えて

10

Java 6Java 7の間で動作が変化する理由はわかりません(他のコンパイラで確認していますか?javac対EclipseコンパイラとIDEAが使用していますか?)。

しかし、あなたはScheduledFutureを拡張するときcompareTo(Delayed)compareTo(Object)を実装していませんなぜ私はあなたを伝えることができます。

ScheduledFutureを使用することにより、あなたはジェネリック医薬品の全てoccurancesがほとんどでは無視されることを意味a raw typeを、使用していますあなたのクラス。それはあなたが今Comparableを実装しようとしている(とはもはやComparable<Delayed>、順番に)あなたがcompareTo(Object)Comparable<Delayed>.compareTo()の消去を実装する必要があることを意味していますが、compareTo(Delayed)を実装することを意味しない

を忘れないでください:。生タイプはを意味しています唯一下位互換性のために。彼らは嫌なことを行う、すべてのコストで新しいコードでそれらを避けてください!

をおScheduledFuture<Object>にごextends句を変更するときジェネリックシステムとコンパイラが最終的に実現する「オプトイン」(すなわち "実現することが許されています」)、あなたの実際には、Comparable<Delayed>インターフェイスの適切な実装はです。

+1

+1:これは、すべてのジェネリックが無視されることを意味する生の型の使用が原因です。 –

+0

Java HotSpotコンパイラ1.6.0_43と1.7.0_25のみを使用しました。 –

+0

@ThomasLarssonKron: "HotSpot"はJVMです。コンパイラではありません。これらのJavaバージョンからはおそらく 'javac'を使用しています。 –

関連する問題