AFAIK, minha classe extends
pai classes e implements
interfaces. Mas me deparo com uma situação em que não posso usar implements SomeInterface
. É a declaração de um tipo genérico. Por exemplo:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
Aqui, o uso implements
é sintaticamente proibido. Pensei primeiro que o uso da interface dentro de <> é proibido, mas não. É possível, eu só tenho que usar em extends
vez de implements
. Como resultado, estou "estendendo" uma interface. Este outro exemplo funciona:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
Para mim, parece uma inconsistência sintática. Mas talvez eu não entenda alguns detalhes do Java 6? Existem outros lugares onde eu devo estender interfaces? A interface, que pretendo estender, deve ter alguns recursos especiais?
fonte
extends
eimplements
é apenas quando se olha para o problema de uma perspectiva pura do sistema de tipos que não há diferença.T
é uma aula?T
poderia referenciar um tipo de interface ou umenum
tipo.:
. e nos bastidores, uma interface é e sempre foi uma classe abstrata com a restrição de conter apenasabstract
membros virtual ( ) não implementados , de modo a permitir herança múltipla. literalmente não há diferença entreimplements
eextends
. ambos poderiam ser substituídos pela mesma palavra (extends
) ou por algum símbolo arbitrário (:
) e nada seria perdido.Quando o Java 5, e em particular os genéricos, foram disponibilizados inicialmente para desenvolvedores que haviam registrado um interesse, a sintaxe era bem diferente. Em vez de
Set<? extends Foo>
eSet<? super Bar>
tinhaSet<+Foo>
eSet<-Foo>
. No entanto, o feedback foi que não estava claro se+
significava mais específico ou mais amplo (mais classes) . A Sun respondeu a esse feedback alterando a sintaxe, mas com a restrição de não introduzir novas palavras-chave, o que teria sido um problema de compatibilidade com versões anteriores.O resultado é que nenhum dos dois é completamente natural. Como você observa,
extends
está sobrecarregado para falar de interfaces "estendendo" as classes, que não é a linguagem usada em outros contextos; esuper
é sobrecarregado para significar "é uma superclasse de", que é a direção oposta ao relacionamento anteriormente expresso pela palavra-chave, ou seja, referindo-se a uma superclasse.No entanto, os fundamentos do que é uma interface não são afetados por essa alteração e não introduz interfaces especiais que são estendidas de uma nova maneira.
fonte
Existem desvantagens em permitir e proibir essa sintaxe, e as de permitir são muito maiores.
Apenas pense nisso.
A separação de interface e implementação é um dos idiomas fundamentais de programação. Por isso, a sintaxe que permite soletrar "interface implementa alguma coisa" seria tão ruim quanto usar um sinal de adição para indicar a multiplicação de operandos.
fonte
É preciso entender a programação orientada a interface como o próximo passo, enquanto a interface é compreendida. Diz o que é o uso real da interface. Qual o papel que ele desempenha em um programa Java (ou qualquer outra linguagem).
fonte