Использование общих типов в статическом контексте
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 в статическом контексте? Я попытался найти несколько ответов, которые не могли найти ничего, что сделало бы snese.
Ответы
Ответ 1
Вам необходимо объявить универсальный тип в сигнатуре метода. Поскольку это статический метод, он не может получить общую информацию из других источников. Так что это должно быть объявлено прямо здесь:
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);
}
}
Ответ 2
E
может означать что угодно. Чтобы использовать E
(как общий), вам нужно создать экземпляр объекта. Вы не можете сделать это, если у вас есть статический метод, потому что общие параметры типа находятся только в области экземпляра класса (который включает его методы экземпляра и поля экземпляра).
Статические члены и поля принадлежат каждому экземпляру класса. Итак, если у вас есть экземпляр BTNode<String>
и еще один экземпляр BTNode<Integer>
, что именно должен использовать статический treeCopy
? String
или Integer
?
Есть рабочий стол; вы должны указать статический метод, что означает E
. Поэтому вам нужно будет определить его следующим образом:
public static <E> BTNode<E> treeCopy(BTNode<E> source)
Это также поможет сделать второй взгляд на ваш дизайн и посмотреть, действительно ли это то, что вы хотите.