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

2022-09-02 03:17:22
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>treeCopyStringInteger

有一个工作;你必须告诉静态方法意味着什么。因此,您必须像这样定义它:E

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

再看一眼你的设计,看看这是否真的是你想要的,这也会有所帮助。


推荐