Java 如何从泛型类调用静态方法?

Java 如何从泛型类调用静态方法?,java,generics,Java,Generics,我有一个包含静态create方法的类 public class TestClass { public static <E> TestClass<E> create() { return new TestClass<E>(); } } 公共类TestClass{ 公共静态测试类create(){ 返回新的TestClass(); } } 当我使用TestClass.create()时,它可以被编译。但是当我使用TestClass.creat

我有一个包含静态create方法的类

public class TestClass {

 public static <E> TestClass<E> create() {
    return new TestClass<E>();
  }

}
公共类TestClass{
公共静态测试类create(){
返回新的TestClass();
}
}

当我使用
TestClass.create()
时,它可以被编译。但是当我使用
TestClass.create()
时,它无法编译,如何指定泛型

假设您要求在类型推断失败的情况下显式指定类型,您可以使用
TestClass.create()
(注意类型在
之后,与之前不同)。

假设您要求在类型推断失败的情况下显式指定类型,您可以使用
TestClass.create()
(注意类型是在
之后,而不是之前)。

是的,这很好。。。不直观的

Josh Bloch在其《有效Java》第二版中关于这个问题的旁注:“每次指定显式类型参数时,上帝都会杀死一只小猫”。我希望避免这样的构造,但有时无法避免


诀窍是在
字符之后指定泛型参数:
TestClass.create()
是的,这很好。。。不直观的

Josh Bloch在其《有效Java》第二版中关于这个问题的旁注:“每次指定显式类型参数时,上帝都会杀死一只小猫”。我希望避免这样的构造,但有时无法避免


诀窍是在
字符之后指定泛型参数:
TestClass.create()

泛型类型可以在类声明中指定:

public class TestClass<E> {

    public static <E> TestClass<E> create() {
        return new TestClass<E>();
    }
}

// Elsewhere in the code
TestClass<String> testClass = TestClass.create();
公共类TestClass{
公共静态测试类create(){
返回新的TestClass();
}
}
//守则的其他地方
TestClass TestClass=TestClass.create();

可以在类声明中指定泛型类型:

public class TestClass<E> {

    public static <E> TestClass<E> create() {
        return new TestClass<E>();
    }
}

// Elsewhere in the code
TestClass<String> testClass = TestClass.create();
公共类TestClass{
公共静态测试类create(){
返回新的TestClass();
}
}
//守则的其他地方
TestClass TestClass=TestClass.create();


谢谢。为什么语法是这样的,非常违反直觉?我不认为任何人期望那些设计泛型的人能够回答这个问题,但我认为这是为了区分泛型类的创建和为非泛型类的泛型方法提供额外的类型参数。语法对我来说并不违反直觉。泛型参数是方法签名的一部分,而不是类签名。因此,应该在点之后。请注意,在大多数情况下,可以推断泛型类型,并且此显式类型信息是冗余的,就像
List strings=Collections.emptyList()
@M Platvoet:这与直觉相反,因为类型参数位于点之后,而不是方法名称。谢谢。为什么语法是这样的,非常违反直觉?我不认为任何人期望那些设计泛型的人能够回答这个问题,但我认为这是为了区分泛型类的创建和为非泛型类的泛型方法提供额外的类型参数。语法对我来说并不违反直觉。泛型参数是方法签名的一部分,而不是类签名。因此,应该在点之后。请注意,在大多数情况下,可以推断泛型类型,并且此显式类型信息是冗余的,就像
List strings=Collections.emptyList()
@M Platvoet:这是违反直觉的,因为类型参数在点之后,而不是方法名称。此[link][1]可能会帮助您。。。[1] :您的示例不是泛型类,而是泛型方法。类声明不应该是
公共类TestClass
公共类Something
?当声明是具体的时,类主体使用TestClass作为泛型,这让我很恼火!?此[链接][1]可能会帮助您。。。[1] :您的示例不是泛型类,而是泛型方法。类声明不应该是
公共类TestClass
公共类Something
?当声明是具体的时,类主体使用TestClass作为泛型,这让我很恼火!?它与TestClass some=TestClass.create()相同吗?它与TestClass some=TestClass.create()相同吗?你的意思是我不需要在create方法中指定类型?不,他意味着编译器可以像本例中那样推断类型。你的意思是我不需要在create方法中指定类型?不,他意味着编译器可以像本例中那样推断类型。