Java 7但不是Java 6:“不是抽象的,不会覆盖抽象方法”

时间:2013-07-29 10:37:13

标签: java generics java-7 type-erasure raw-types

有人可以解释为什么这会在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生成的。

错误消息表明编译器要求类声明一个compareTo方法,该方法采用Object类型参数,此类需要Delayed。 但是,ScheduledFuture界面定义为扩展Delayed,后者又扩展Comparable<Delayed>,所以对我来说似乎一切都井然有序。

如果我只是将声明更改为

private class Example implements ScheduledFuture<Object>

它编译。<​​/ p>

我猜这与某种类型的删除有关,但我无法解释它以满足自己。

1 个答案:

答案 0 :(得分:10)

我真的不知道为什么行为会在Java 6Java 7之间发生变化(您是否已经与其他编译器验证过了?javac与Eclipse编译器相比,IDEA使用的是什么?)

但是我可以告诉你为什么compareTo(Delayed)在扩展compareTo(Object)实施ScheduledFuture

使用ScheduledFuture,您正在使用a raw type,这意味着您的课程中几乎忽略了所有出现的泛型。这意味着您现在正在实施Comparable(不再是Comparable<Delayed>,这反过来意味着您需要实施compareTo(Object)Comparable<Delayed>.compareTo()的删除),但是您实施compareTo(Delayed)

请记住:原始类型仅指 以实现向后兼容性。不惜一切代价在新代码中避免使用它们,它们会做出讨厌的事情!

当您将extends子句更改为ScheduledFuture<Object>时,您“选择加入”到泛型系统,编译器最终意识到(即“允许实现”)您的compareTo(Delayed)实际上是Comparable<Delayed>接口的正确实现。