Что касается оператора
каждый раз, когда я пытался удалить дополнительный - никаких новых ошибок / предупреждений не было.
blockquote>Это не должно быть дело. Он должен печатать предупреждение, потому что вы используете raw type
Some
, и в результате этого отсутствует безопасность типа, как показано в ответе на newacct .Пример
Dog
/Cat
немного надуман и несколько испорчен. Вы предложили объявить классpublic class Dog extends Animal
{ } // Note "Cat" !!! . Но здесь параметр типа в основном означает: «Этот параметр (
Cat
) является типом, который объекты этого класса (Dog
) могут быть по сравнению с ". Таким образом, вы явно заявляете , чтоDog
должен быть сопоставим сCat
. В конце концов, даже разработчикам сложного языка и умных компиляторов приходится программировать код, который имеет смысл.Действительно, не так много случаев, когда эти самореферентные общие типы необходимо. Один из этих примеров нарисован в этой записи в FAQ: Он объявляет структуру узлов (то есть дерево), где параметр типа может использоваться для отграничения определения структуры дерева / g5] из фактического типа узлов:
public class RecurringTest { public static void main(String[] args) { SpecialNode sa = new SpecialNode(null); SpecialNode sb = new SpecialNode(sa); SpecialNode s = sa.getChildren().get(0); } } abstract class Node
> { private final List children = new ArrayList (); private final N parent; protected Node(N parent) { this.parent = parent; if (parent != null) { this.parent.getChildren().add(getThis()); } } abstract N getThis(); public N getParent() { return parent; } public List getChildren() { return children; } } class SpecialNode extends Node { public SpecialNode(SpecialNode parent) { super(parent); } SpecialNode getThis() { return this; } } Но из моего личного опыта я могу сказать, что, когда вы думаете, что вам нужно создать такую типа, вы должны тщательно подумать о преимуществах и недостатках. Последнее в основном относится к уменьшенной читаемости. Если у вас есть выбор между такими методами, как
Node extends Node extends N, ? extends T>, T> doSomething( Node super Node extends N>, ? extends T> p, Node extends Node super N>, ? super T> c) { ... }
, которые являются безопасными по типу, или такими методами, как
Node doSomething(Node parent, Node child) { ... }
, которые не являются безопасными типа (из-за необработанных типов или просто потому, что типы не были обобщены), тогда я предпочел бы последний. Код читается людьми.