这是一个简化的示例,展示了我的问题:
在
那么我有两个问题:
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()
(取决于编译器)。当然,我使用的是Java 8。MyTask.java:3: error: MyTask is not abstract and does not override abstract method get(int) in AbstractList
那么我有两个问题:
- 为什么会出现这些错误?我原本期望它能够识别默认实现。
- 如果它不能像预期那样工作,那么如何在不复制整个代码的情况下在
MyTask
中使用这两种方法最简单呢?
size()
未实现时出现了问题:这可能是Eclipse的一个bug。而javac
1.8.0_51在未实现get(int)
时出现问题,这是正确的:它确实没有被实现。 - Tunakisize
和get
都被同等地实现/未实现。 - aditsu quit because SE is EVILSingleTask是单例模式的实现
,你刚刚说了它。如果它是一个实现,那么它应该是一个类,而不是一个接口。你在这里尝试使用默认方法看起来有点像特征,但它们并不是为此设计的。 - biziclopList
实现,即使是像equals
或hashCode
这样关键的方法也会出现问题,因为它们可能会导致StackOverflowError
。这个递归数据结构有什么意义呢? - Holger