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

标签 java generics

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

定义一个方法将包括一个返回类型+带参数的方法名

newInstance 的返回类型是 SomeClass 我觉得很奇怪 因为我的类(class)叫做 SomeClass 而不是 SomeClass

why do i need the <T> in front of the SomeClass<T> ? it seems that if I don't include it there will be an common error called Cannot make a static reference to the non-static type T

要指出的另一件事是,我可以在 和 SomeClass 之间放置许多空格,因此看起来它们不需要放在一起。

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);
    }
}

最佳答案

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

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

但是如果你不包括 <T>使用该方法,编译器认为您正在尝试使用 T在类签名中。这是非法的。

关于java - (泛型)不能对非静态类型 T 进行静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36386295/

相关文章:

java - 理解 perf.map

Java:通用序列化方法

Delphi在函数中分配通用值

java - 如何在没有 getKey 方法的情况下从 Java 中的对象列表创建 map 列表?

Java 泛型、类型删除、通配符和 Function<?...> 产生不兼容的类型

java - 如何对 HashMap 的所有键进行循环?

java - 使用 Jackson 反序列化泛型

JavaFX - 从 gui 接收事件后返回主线程

java - 您可以使用 RandomAccessFile 访问远程 FTP 服务器上的文件吗?

java - 为什么不能将 ArrayList 分配给 List 变量?