Использование общих типов в статическом контексте

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)

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