在静态上下文中使用泛型类型

use*_*202 21 java generics static

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);
     }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我不能在静态上下文中使用泛型Type E?我试过搜索几个答案找不到任何让他们嗤之以鼻.

jjn*_*guy 20

您需要在方法签名中声明泛型类型:

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);
     }
}
Run Code Online (Sandbox Code Playgroud)


Viv*_*ath 11

E可以意味着什么.要使用E(作为通用),您需要创建对象的实例.如果您有静态方法,则不能这样做,因为泛型类型参数仅在类的实例的范围内(包括其实例方法和实例字段).

静态成员和字段属于该类的每个实例.因此,如果你有一个实例BTNode<String>和另一个实例BTNode<Integer>,静态treeCopy应该使用什么?String还是Integer

有一个workaroud; 你必须告诉静态方法是什么E意思.所以你必须像这样定义它:

public static <E> BTNode<E> treeCopy(BTNode<E> source)
Run Code Online (Sandbox Code Playgroud)

再看看你的设计也会有所帮助,看看这实际上是你想要的.