为什么需要在JAVA中的void静态方法签名中声明泛型类型?

时间:2015-03-31 00:51:16

标签: java generics

为什么我必须使用已使用的Generic类跟随静态以便编译以下代码?

public static<Integer>void main(String args[]){

        BinaryTree<Integer> tree = new BinaryTree<Integer>();

}

2 个答案:

答案 0 :(得分:1)

我只能假设你要做的是定义一个BinaryTree类,其节点的类型为Integer,所以你写了这样的东西。

public class BinaryTree<Integer> {

    // Code

    public static void main(String args[]) {
        BinaryTree<Integer> tree = new BinaryTree<Integer>();
    }
}

在上面的代码中,Integer没有通常的含义。因为它出现在类名后面的尖括号中,实际上它是一个类型参数。通常,类型参数具有单字母名称,但允许使用名称Integer

因为main方法是静态的(属于类,而不是类的单个实例),所以它无法访问type参数。这就是main的代码无法编译的原因。

写作

publie static <Integer> void main(String args[])

相反,您正在使main方法通用。方法的类型参数(同样称为Integer!)隐藏了类的类型参数,代码编译。

要解决此问题,您可以让类具有类型参数T,或者只是完全删除类类型参数(如果所有BinaryTree实例都具有类型Integer,则没有根本需要这个类是通用的。)

答案 1 :(得分:0)

我猜这可能无法编译的一种方式可能就是你有这样的东西

public class Test<Integer> {
     public static<Integer> void main(String args []){
        Map<Integer, String> aHash = new HashMap<Integer, String>();
    }
}

你正在使用&#34;整数&#34;作为一个类型参数(这是合法的,虽然可能不是最好的主意)

现在这适用于非静态方法,即

public class Test<Integer> {
     public  void main(String args []){
        Map<Integer, String> aHash = new HashMap<Integer, String>();
    }
}

编译正常,但对于静态方法,不能使用类类型参数,因为您要对非静态类型参数进行静态引用。