在這裏是表示我的問題的簡化示例:必須實現默認的接口方法嗎?
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