gpt4 book ai didi

Java 7 但不是 Java 6 : "is not abstract and does not override abstract method"

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:34 26 4
gpt4 key购买 nike

谁能解释为什么这在 JDK 1.6 中编译,但在 JDK 1.7 中却没有,我从中得到了错误消息:

java: Example is not abstract and does not override abstract method compareTo(java.lang.Object) in java.lang.Comparable?

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接口(interface)被定义为扩展 Delayed这又扩展了Comparable<Delayed>所以对我来说一切似乎都井井有条。

如果我只是将声明更改为

private class Example implements ScheduledFuture<Object>

它编译。<​​/p>

我猜它与类型删除有某种关系,但我无法真正解释它以使自己满意。

最佳答案

我真的不知道为什么行为会在 Java 6 之间发生变化和 Java 7 (您是否使用其他编译器验证过这一点?javac 对比 Eclipse 编译器对比 IDEA 使用的任何编译器?)。

但我可以告诉你为什么compareTo(Delayed) 实现compareTo(Object)当你扩展 ScheduledFuture :

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

记住:原始类型是为了向后兼容。不惜一切代价避免在新代码中使用它们,它们会做一些令人讨厌的事情!

当您更改 extendsScheduledFuture<Object> 的条款您“选择加入”泛型系统,编译器最终意识到(即“被允许意识到”)您的 compareTo(Delayed)实际上是 Comparable<Delayed> 的正确实现界面。

关于Java 7 但不是 Java 6 : "is not abstract and does not override abstract method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com