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

时间:2010-11-17 20:55:33

标签: 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);
     }

}

我的问题是为什么我不能在静态上下文中使用泛型类型E?我试过搜索几个答案找不到任何让我们冷静的事。

2 个答案:

答案 0 :(得分: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);
     }
}

答案 1 :(得分:9)

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

静态成员和字段属于该类的每个实例。因此,如果您有BTNode<String>的实例和BTNode<Integer>的另一个实例,那么静态treeCopy究竟应该使用什么? StringInteger

有一个workaroud;你必须告诉静态方法E的含义。所以你必须这样定义:

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

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