2012-06-10 6 views
10

Kann mir jemand sagen, was die Unterschiede zwischen den ersten und zweiten Codes sind? MaxPQ steht für Priority Queue, eine Sammlung von "Key" -Objekten, die miteinander verglichen werden können.implementiert vs erstreckt sich in Generics in Java

Code 1:

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

Code 2:

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

Der zweite Code nicht kompiliert, aber es ist mir nicht intuitiv, warum wir statt implementieren Schnittstellen erweitern müssen bei der Verwendung von ein Generikum.

+1

Eine ähnliche Frage kann in [hier] [1] gefunden werden. [1]: http://stackoverflow.com/questions/976441/java-generics-why-is-extends-t-allowed-but-not-implements-t – krakover

Antwort

10

Der Unterschied ist ziemlich einfach: zweites Code-Snippet kompiliert nicht und wird nie. Bei Generika verwenden Sie immer extends für Klassen und Schnittstellen. Auch super Schlüsselwort kann dort verwendet werden, aber es hat unterschiedliche Semantik.

+0

danke, gibt es eine Grund dafür? – Popcorn

+0

@MarkX: Nicht wirklich, so wurden Generika entwickelt und spezifiziert. Einfachheit? –

+3

@Mark Ein Grund ist: 'Key' könnte ein Interface selbst sein und plötzlich würde es wieder' extend' sein, obwohl Comparable ein Interface ist. Da Sie es in allen Fällen nicht absolut richtig machen können, wurde es bevorzugt, nur konsistent inkonsistent zu sein. – Voo

1

Es gibt keine Utensilien in Generics. Der zweite Code ist ungültig. Sie wahrscheinlich mit verwirrend:

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

Ich nehme an, es wurde beschlossen, verwenden extends sowohl für Schnittstellen und Klassen, weil im Fall von generischer Klassendeklaration macht es keinen Unterschied machen, ist Typargument Schnittstelle oder Klasse gebunden.

Natürlich unterscheidet sich die Bedeutung von extends ziemlich von seiner typischen Verwendung in der Klassendefinition. Angelika Langer haben einen schönen Text über verschiedene Bedeutungen von extends in Java: Does "extends" always mean "inheritance"?