public <T extends INode> T getNode(final int offset);
Это не только не дает никакой дополнительной информации к абоненту, но прямо опасно: Единственный способу реализации этого метод подписи является использование непроверенного броска, который не может быть типобезопасным , поскольку параметры типа метода задаются его вызывающим (явно или неявно через вывод типа), а параметры типа недоступны для реализации этого метода. Например, рассмотрим следующую программу:
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!)
}
}
Лучшая практика: Не использовать непроверенную бросок, если вы не действительно, что это будет тип правильно во время выполнения.
Я думаю, что общие типы возвращаемого значения имеют значение только в том случае, если один из параметров одного типа (или супер/подтип)?
Есть несколько случаев, например:
public <T> T getFavorite(Class<T> clazz) {
return clazz.cast(favorites.get(clazz));
}
или
interface List<E> {
E get(int index);
}
или примеры в ответ Колина, где переменная типа только появляется в качестве параметра типа в обратном тип, который является приемлемым из-за стирания типа.
Edit:
Я думаю, что есть тип не сохранить путь, если один хочет, чтобы бросить к точному типу узла (вместо InstanceOf должен предшествовать ей)
Конечно, есть есть, это называется visitor pattern.
Возможно, что это добавит больше значения, однако я бы подумал, что это добавит еще большее значение, если общий параметр был определен в классе. – Joel
В чем вопрос? Что «не добавляет чего-то» означает? –