Perché un'interfaccia sostituisce i metodi delle interfacce che estende in Java 7?

6

Stavo guardando Mappa e SoldMaps documentazione da Java 7 e ho capito che SortedMap , che estende Map sostituisce entrySet() , keySet() e values() .

AFAIK, le interfacce non possono implementare un metodo in Java prima di Java 8. Quindi qual è stata la ragione per sovrascrivere questi metodi?

    
posta Utku 09.04.2016 - 12:22
fonte

3 risposte

6

Sembra che i metodi siano stati sovrascritti solo in modo da poter fornire documentazione diversa.

Per tutti e tre i metodi, l'unica differenza nella documentazione è che la versione SortedMap aggiunge "L'iteratore dell'insieme restituisce le voci in ordine crescente di chiave." alla descrizione principale e "ordinati in ordine crescente di chiave" alla descrizione del valore di ritorno.

P.S. L'ovvia domanda di follow-up è perché le tre firme dei metodi non sono state modificate semplicemente per restituire SortedSet anziché Set . Sfortunatamente non riesco a trovare una ragione per questo, dal momento che il linguaggio Java sembra consentire questo tipo di cambiamento, e i metodi aggiuntivi su SortedSet sembrano banali da implementare.

    
risposta data 09.04.2016 - 15:21
fonte
2

Da Java Language Spec per Java 7 :

About all that can be accomplished by an overriding method declaration, other than to affirm a method signature, is to refine the return type or to restrict the exceptions that might be thrown by an implementation of the method.

Quindi: puoi modificare la firma throws e / o specificare un sottotipo più specifico del tipo di ritorno originale. Ad esempio:

interface Foo {
  Foo get() throws IOException;
}

interface Bar extends Foo {
  Bar get() throws RuntimeException;
}

È completamente legale, come sarebbe omettere la clausola throws completamente per uno solo.

    
risposta data 23.05.2017 - 20:00
fonte
0

Non penso che esista qualcosa come i metodi di interfaccia che sono in grado di "sovrascrivere" i metodi di interfaccia genitore (in Java 7); solo le (sotto) classi possono avere metodi "override". SortedMap e Map sono interfacce e non classi. Pertanto, ciò che stai vedendo è semplicemente un problema di documentazione, piuttosto che un problema tecnico.

(E l'overloading per sotto-interfacce è un'altra storia, anche se i metodi che stai citando non sono sovraccarichi in quanto hanno la stessa firma.)

    
risposta data 09.04.2016 - 19:24
fonte

Leggi altre domande sui tag