[英]Java 7 but not Java 6: “is not abstract and does not override abstract method”
有人可以解释为什么这会在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>
它汇编。
我猜这与某种类型的擦除有关,但我无法解释它以满足自己。
我真的不知道为什么Java 6和Java 7之间的行为会发生变化(您是否已经使用其他编译器验证了这一点? javac
与Eclipse编译器相比,IDEA使用的是什么?)。
但是我可以告诉你为什么compareTo(Delayed)
compareTo(Object)
在扩展ScheduledFuture
时没有实现compareTo(Object)
:
通过使用ScheduledFuture
,您使用的是原始类型 ,这意味着在您的类中几乎忽略了泛型的所有出现 。 这意味着你现在正在实现Comparable
(并且不再是Comparable<Delayed>
,这反过来意味着你需要实现compareTo(Object)
(删除Comparable<Delayed>.compareTo()
),但你实现了compareTo(Delayed)
。
请记住:原始类型仅用于向后兼容。 不惜一切代价避免在新代码中使用它们,它们会做出讨厌的事情!
当您将extends
子句更改为ScheduledFuture<Object>
您“选择加入”泛型系统,并且编译器最终实现(即“允许实现”)您的compareTo(Delayed)
实际上是Comparable<Delayed>
的正确实现Comparable<Delayed>
界面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.