(泛型)不能对非静态类型T进行静态引用

sec*_*ova 5 java generics

运行Demo类将在SomeClass中调用静态方法newInstance来调用构造函数并打印hello

定义方法将包含带参数的返回类型+方法名称

newInstance的返回类型是<T> SomeClass <T>对我来说似乎很奇怪,因为我的类被称为SomeClass <T>而不是<T> SomeClass <T>

为什么我需要在SomeClass <T>前面的<T>?似乎如果我不包含它,将会出现一个常见错误,称为无法对非静态类型T进行静态引用

另外要指出的是,我可以在<T>和SomeClass <T>之间放置许多空格,因此它们似乎不需要在一起.

public class SomeClass<T> {

    public static <T>SomeClass<T> newInstance(Class<T> clazz){
        return new SomeClass<T>(clazz);
    }

    private SomeClass(Class<T> clazz){
        System.out.println("hello");
    }
}

public class Demo {

    public static void main(String args[])
    {
        SomeClass<String> instance = SomeClass.newInstance(String.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jor*_*nee 12

什么是静态方法?适用于类的方法,而不是特定的实例.T类签名中的泛型参数public class SomeClass<T>仅适用于特定实例(因此non-static type T).例如SomeClass<String>,在哪里[T = String].

通过<T>在方法签名中包括public static <T>SomeClass<T> newInstance(Class<T> clazz).你这么说; 对于此方法,存在泛型类型参数T.这与类签名T分开T.所以它可能C也就是说public static <C> SomeClass<C> newInstance(Class<C> clazz).或者完全不同的东西.

但是,如果您不包含<T>该方法,编译器会认为您正在尝试使用T类签名.哪个是非法的.