【发布时间】:2013-07-29 10:37:12
【问题描述】:
有人能解释一下为什么它在 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>
它编译。
我猜这与类型擦除有关,但我无法真正解释它以满足自己。
【问题讨论】:
-
我会代替你从 1.6 和 1.7 中查找 ScheduledFuture 的 javadoc 并检查发生了什么变化。
-
发生在我身上的是,Java 6 不会阻止参数化类的原始类型继承,而 7 会
标签: java generics java-7 type-erasure raw-types