2013-03-01 2 views
2

У меня есть класс TreeNode определяются следующим образом:Дженерик с такими же базовым классом

class TreeNode<T extends MyClass> { 
    public T element; 
    public TreeNode<? extends MyClass> parent; 
    public ArrayList<TreeNode<? extends MyClass>> children; 
} 

Я хотел бы знать, если есть более простой способ, чтобы ограничить все TreeNodes переменных универсального типа, которые простираются MyClass? Выписать ArrayList<TreeNode<? extends MyClass>> очень утомительно. Я не могу просто сделать ArrayList<TreeNode<T>>, потому что тогда Tree не может содержать узлы с другим наследованием MyClass.

Я попытался сделать что-то вроде этого: public static const Class NODE_CLASS = TreeNode<? extends TreeNode>.class;, но я не думаю, что вы можете использовать generics как часть объекта класса.

Сокетирующий синоним C++ typedef Я предполагаю, I.e. typedef TreeNode<? extends MyClass> NodeClass;

+1

Если честно, я не вижу смысла использовать дженерики, если 'T' не совпадает между узлами в дереве. Учитывая, что 'element' должен быть просто' MyClass'. –

+0

Ahh да, конечно, просто сделайте их всеми базовыми типами! – Lerp

+2

Точно так же, как sidenote: я бы заменил 'ArrayList <...>' просто «List <...>'. – Thomas

ответ

4

Поскольку мой комментарий, казалось, чтобы помочь вам, я отправлю его в качестве ответа:

Я не вижу смысла с использованием дженериков, если T не совпадают между узлами в дереве. Учитывая, что element должно быть только MyClass.

+2

Это был самый быстрый подъем, который я когда-либо видел - как вы это сделали? –

+2

Я был на странице, когда сказал «1 новый ответ», поэтому я загрузил и поддержал: P – Lerp

+1

Ха, из моего POV это буквально началось с 1 голоса. Желаю, чтобы все мои ответы сделали это :) –

1

FWIW, повторяя границу параметра типа (T extends MyClass) в качестве границы шаблона (? extends MyClass), абсолютно ничего не делает. Просто используйте неограниченный шаблон ? (как в TreeNode<?>).

+0

Не может ли кто-то еще прочитать код, чтобы понять, что он может содержать только узлы, расширяющие MyClass? Я не оспариваю тебя. Мне просто интересно, будет ли это веской причиной? – Lerp

+2

@ Lerp, если пользователь знает о классе 'TreeNode', она также знает, что не может существовать никаких экземпляров, в которых параметр _not_ расширяет' MyClass' (за исключением случаев использования типов raw). – Thomas

2

Если вы хотите сохранить генерики вы могли бы сократить

ArrayList<TreeNode<? extends MyClass>> children; 

в

List<TreeNode<?>> children; 

Поскольку extends MyClass указано в определении класса компилятор все еще в состоянии сделать вывод, что только узлы дерева с разрешается только параметр MyClass (или MyClass).

Просто имейте в виду, что вам нужно использовать MyClass при обращении к элементу, так как это единственный известный общий суперкласс.