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?我试过搜索几个答案找不到任何让我们冷静的事。
答案 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
究竟应该使用什么? String
或Integer
?
有一个workaroud;你必须告诉静态方法E
的含义。所以你必须这样定义:
public static <E> BTNode<E> treeCopy(BTNode<E> source)
再看一下你的设计也会有所帮助,看看这实际上是你想要的。