これがJDK 1.6でコンパイルされ、エラーメッセージが表示されるJDK 1.7ではコンパイルされない理由を誰かが説明できますか:
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>
コンパイルします。
どういうわけか型消去に関係していると推測していますが、自分自身を満足させるためにそれを本当に説明することはできません.