Использование универсальных типов в статическом контексте - PullRequest
19 голосов
/ 17 ноября 2010
public static BTNode<E> treeCopy(BTNode<E> source)
{
     if(source == null)
         return null;
     else
     {
         BTNode left = BTNode.treeCopy(source.left);
         BTNode right = BTNode.treeCopy(source.right);
         return new BTNode(source.data, left, right);
     }

}

Мои вопросы: почему я не могу использовать универсальный тип E в статическом контексте? Я попытался найти несколько ответов, но не смог найти ничего, что вызвало бы сне.

Ответы [ 2 ]

20 голосов
/ 17 ноября 2010

Вам необходимо объявить универсальный тип в сигнатуре метода:

public static <E> BTNode<E> treeCopy(BTNode<E> source)
{
     if(source == null)
         return null;
     else
     {
         BTNode<E> left = BTNode.treeCopy(source.left);
         BTNode<E> right = BTNode.treeCopy(source.right);
         return new BTNode(source.data, left, right);
     }
}
10 голосов
/ 17 ноября 2010

E может означать что угодно.Чтобы использовать E (как универсальный), вам нужно создать экземпляр объекта.Вы не можете сделать это, если у вас есть статический метод, потому что общие параметры типа находятся в области видимости только для экземпляра класса (который включает в себя его методы экземпляра и поля экземпляра).

Статические члены и поля принадлежат каждомуэкземпляр класса.Итак, если у вас есть экземпляр BTNode<String> и другой экземпляр BTNode<Integer>, что именно должен использовать статический treeCopy?String или Integer?

Есть обходной путь;Вы должны сказать статическому методу, что означает E.Поэтому вам придется определить его следующим образом:

public static <E> BTNode<E> treeCopy(BTNode<E> source)

Это также поможет еще раз взглянуть на ваш дизайн и посмотреть, действительно ли это то, что вы хотите.

...