在这里是表示我的问题的简化示例:必须实现默认的接口方法吗?
import java.util.List;
public interface SingleTask extends List<Runnable>, Runnable {
default Runnable get(final int x) {
if (x != 0) {
throw new IndexOutOfBoundsException();
}
return this;
}
default int size() {
return 1;
}
}
import java.util.AbstractList;
public class MyTask extends AbstractList<Runnable> implements SingleTask {
@Override
public void run() {
System.out.println("hello");
}
}
在SingleTask
我的方法get
和size
,它们是从AbstractList
唯一抽象方法的实现。然而,当我编译MyTask
,我还是得到这样的错误:
The type MyTask must implement the inherited abstract method AbstractCollection.size()
或
MyTask.java:3: error: MyTask is not abstract and does not override abstract method get(int) in AbstractList
(取决于编译器)。我,当然,用java 8
所以我有两个问题:
- 为什么会出现这些错误?我期待它识别默认实现。
- 如果不应该这样工作,那么在不复制整个代码的情况下在
MyTask
中使用这两种方法的最简单方法是什么?
不要让你的任务扩展'List'(这意味着什么意思,语义无论如何?),而是创建一个接口'任务'与'公共列表 getRunnables();'方法。否则,只需将SingleTask作为抽象类而不是接口即可。 –
biziclop
值得注意的是Eclipse没有实现'size()',这可能是Eclipse的一个bug。 'javac' 1.8.0_51扼杀了'get(int)'没有被执行,它是正确的:它没有被实现。 – Tunaki
@biziclop它应该是一个任务清单; SingleTask是一个单例实现 – aditsu