2012-06-10 32 views
10

Czy ktoś może mi powiedzieć, jakie są różnice między pierwszym a drugim kodem? MaxPQ oznacza kolejkę priorytetową, która jest zbiorem obiektów "Key", które można porównywać ze sobą.implements vs extends in generics w Javie

Kod 1:

public class MaxPQ<Key extends Comparable<Key>>{ 
... 
} 

Kod 2:

public class MaxPQ<Key implements Comparable<Key>>{ 
... 
} 

Drugi kod nie kompiluje, ale to nie jest intuicyjny mi, dlaczego musimy rozszerzyć zamiast implementują interfejsy przy użyciu rodzajowy.

+1

Podobne pytanie można znaleźć w [tutaj] [1]. [1]: http://stackoverflow.com/questions/976441/java-generics-why-is-extends-t-allowed-but-not-implements-t – krakover

Odpowiedz

10

Różnica jest dość prosta: drugi fragment kodu nie kompiluje się i nigdy nie będzie. W przypadku generycznych zawsze używasz extends, zarówno dla klas, jak i interfejsów. Można tam również użyć słowa kluczowego super, ale ma ono inną semantykę.

+0

dziękuję, czy istnieje powodem tego? – Popcorn

+0

@ MarkX: nie do końca, w ten sposób zaprojektowano i określono generyczne typy genów. Prostota? –

+3

@Mark Jednym z powodów jest: 'Key' może być sam interfejs i nagle byłoby' extends' ponownie mimo Porównywalna jest interfejsem. Ponieważ nie jest to absolutnie poprawne we wszystkich przypadkach, preferowane były tylko konsekwentne niespójności. – Voo

1

W narzędziach ogólnych nie ma narzędzi. Drugi kod jest nieprawidłowy. Prawdopodobnie mylące z:

public class MaxPQ implements Comparable<Key> { 
    ... 
} 
0

Zakładam, że zdecydowano się na wykorzystanie extends dla obu interfejsów i klas, ponieważ w przypadku ogólnych deklaracji klasy to nie robi żadnej różnicy jest typ argumentu zobowiązany do współpracy lub do klasy.

Oczywiście znaczenie extends jest dość różne od typowego użycia w definicji klasy. Angelika Langer ma ładny tekst o różnych znaczeniach extends w Javie: Does "extends" always mean "inheritance"?