Ecco un esempio semplificato che mostra il mio problema:Deve implementare il metodo di interfaccia predefinito?
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 fornire implementazioni per i metodi get
e size
, che sono gli unici metodi astratti da AbstractList
. Tuttavia, quando compilo MyTask
, ho ancora ottenere errori come:
The type MyTask must implement the inherited abstract method AbstractCollection.size()
o
MyTask.java:3: error: MyTask is not abstract and does not override abstract method get(int) in AbstractList
(a seconda del compilatore). Sono, ovviamente, utilizzando Java 8.
Così ho due domande:
- Perché ricevo questi errori? Mi aspettavo che riconoscesse le implementazioni predefinite.
- Se non dovrebbe funzionare in questo modo, qual è il modo più semplice per utilizzare questi due metodi in
MyTask
senza copiare l'intero codice?
Non prolungare le attività 'Elenco' (cosa vuol dire semanticamente lo stesso?), Invece creare un'interfaccia 'Task' con un' Elenco pubblico getRunnables(); 'metodo. In caso contrario, è sufficiente rendere 'SingleTask' una classe astratta anziché un'interfaccia. –
biziclop
Vale la pena notare che Eclipse sta soffocando su 'size()' non implementato: questo è probabilmente un bug di Eclipse. 'javac' 1.8.0_51 sta soffocando su' get (int) 'non viene implementato ed è giusto: non è implementato. – Tunaki
@biziclop dovrebbe essere una lista di compiti; SingleTask è un'implementazione singleton – aditsu