public <T extends INode> T getNode(final int offset);
Nicht nur, dass dies nicht mit dem Anrufer keine zusätzliche Informationen liefern, sondern ist geradezu gefährlich: Die einzige Möglichkeit, diese Methode Unterschrift zu implementieren, ist einen ungeprüft Guss, zu verwenden, die nicht sicher Typ sein , weil die Typparameter einer Methode von ihrem Aufrufer angegeben werden (explizit oder implizit durch Typinferenz) und die Typparameter für die Implementierung dieser Methode nicht verfügbar sind. Betrachten wir zum Beispiel das folgende Programm:
class NodeCollection {
private INode[] nodes = new INode[42];
public <T extends INode> T getNode(final int offset) {
return (T) nodes[offset];
}
public <T extends INode> setNode(final int offset, T node) {
nodes[offset] = node;
}
}
class ANode implements INode {}
class BNode implements INode {
void foo();
}
public class Test {
public static void main(String[] args) {
NodeCollection nc = new NodeCollection();
nc.setNode(0,new ANode());
BNode b = nc.getNode(0); // throws ClassCastException (sic!)
}
}
Best Practice: Verwenden Sie einen ungeprüften Guss nicht verwenden, es sei denn, Sie wirklich sicher sind, wird es richtig Typ zur Laufzeit sein.
Ich denke, generische Rückgabetypen sind nur von Wert, wenn einer der Parameter vom gleichen Typ (oder ein Super/Subtyp) ist?
Es gibt weitere Fälle, zum Beispiel:
public <T> T getFavorite(Class<T> clazz) {
return clazz.cast(favorites.get(clazz));
}
oder
interface List<E> {
E get(int index);
}
oder die Beispiele in Colins Antwort, wobei die Variable vom Typ erscheint nur als Typ-Parameter im Rück Typ, der aufgrund von Typ löschen akzeptabel ist.
bearbeiten:
Ich denke, es gibt keine Art Art und Weise speichern, wenn man will, auf die genaue Art des Knotens werfen (statt instanceof muss es vorangehen)
Natürlich gibt ist, heißt es visitor pattern.
Es ist möglich, dass es mehr Wert hinzufügt, aber ich würde denken, dass es noch mehr Wert hinzufügen würde, wenn der generische Parameter in der Klasse definiert wäre. – Joel
Was ist die Frage? Was "fügt nichts hinzu" bedeutet? –