Hier ist ein vereinfachtes Beispiel mein Problem zeigt:Muss Standard-Interface-Methode implementieren?
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");
}
}
In SingleTask
I bieten Implementierungen für die Methoden get
und size
, die die einzigen abstrakten Methoden von AbstractList
sind. Allerdings, wenn ich kompilieren MyTask
, bekomme ich immer noch Fehler wie:
The type MyTask must implement the inherited abstract method AbstractCollection.size()
oder
MyTask.java:3: error: MyTask is not abstract and does not override abstract method get(int) in AbstractList
(je nach Compiler). Ich bin natürlich, java 8.
Also ich habe zwei Fragen:
- Warum erhalte ich diese Fehler zu bekommen? Ich habe erwartet, dass es die Standardimplementierungen erkennt.
- Wenn es nicht so funktionieren soll, was ist der einfachste Weg, diese beiden Methoden in
MyTask
zu verwenden, ohne den gesamten Code zu kopieren?
Lassen Sie Ihre Aufgaben nicht erweitern 'List' (was bedeutet das eigentlich semantisch?), Sondern erstellen Sie eine Schnittstelle 'Task' mit einer' public List getRunnables(); 'Methode. Wenn Sie das nicht machen, machen Sie 'SingleTask' einfach eine abstrakte Klasse anstelle einer Schnittstelle. –
biziclop
Bemerkenswert ist, dass Eclipse auf der 'size()' erstickt ist nicht implementiert: Dies ist wahrscheinlich ein Eclipse-Fehler. 'javac' 1.8.0_51 erstickt an' get (int) 'wird nicht implementiert und es ist richtig: es ist nicht implementiert. – Tunaki
@biziclop es sollte eine Liste von Aufgaben sein; SingleTask ist eine Singleton-Implementierung – aditsu