Sto provando a scrivere una libreria di interfacce di raccolta che implementa la maggior parte dei metodi nell'API di raccolta standard utilizzando la nuova sintassi del metodo predefinito in Java 8. Ecco un piccolo esempio di ciò vado a fare:Errore Java 8: Eredita dell'interfaccia astratta e predefinita
public interface MyCollection<E> extends Collection<E> {
@Override default boolean isEmpty() {
return !iterator().hasNext();
}
//provide more default overrides below...
}
public interface MyList<E> extends MyCollection<E>, List<E> {
@Override default Iterator<E>iterator(){
return listIterator();
}
//provide more list-specific default overrides below...
}
Tuttavia, anche questo semplice esempio è incontrato con un errore di compilazione:
error: interface MyList<E> inherits abstract and default
for isEmpty() from types MyCollection and List
Dalla mia comprensione di metodi predefiniti, questo dovrebbe essere permesso in quanto solo uno dei esteso interfacce fornisce un'implementazione predefinita, ma ap parently non è il caso. Cosa sta succedendo qui? C'è un modo per ottenere ciò per fare ciò che voglio?
La necessità di duplicare tutte queste firme di metodo è deludente, ma questo sembra esattamente quello che stavo cercando. Accettato, supponendo che non ci sia modo di evitarlo. –
La cosa veramente negativa è che non c'è alcun motivo per 'List' per redeclare' isEmpty() '. Il suo unico scopo sembra essere quello di modificare il commento della documentazione dall'eredità "Restituisce true se questa raccolta non contiene elementi." Al più specifico "Restituisce true se questo elenco non contiene elementi." Senza questo, tutto funzionerebbe come prima ma il compilare l'errore da questa domanda sarebbe andato come 'MyCollection.isEmpty()' sovrascrive 'Collection.isEmpty()' ... – Holger
@Holger Hai ragione in questo caso. Ma per altri metodi come 'toArray', la documentazione differisce maggiormente in termini di contratto del metodo. Penso che questo problema si presenta come un prezzo per l'utilizzo di metodi predefiniti. – manouti