示例非常简单。我想要的是书面的。问题在评论中。
import java.util.*;
class Main
{
private static class X<T> {
public static T get() { return new T(); }
}
public static void main(String[] args)
{
System.out.println(X<Interger>.get()); // illegal start of type
// commenting out above yields:
// error: non-static type variable T cannot be referenced from a static context
}
}
真正让我困惑的是error: non-static type variable T cannot be referenced from a static context
。错误似乎很明显:类&方法是静态的,但类型变量不是。我可以让类型变量在这个静态上下文中工作吗。
此外,在编写示例时,我不明白为什么在没有其他内容的情况下会出现illegal start of type
错误。这是因为隐藏了关于非静态类型变量的错误吗?
您不能执行new T()
。首先,不能保证T
有一个可访问的无参数构造函数。与此相关的是,Integer
没有arg构造函数。
静态方法以及实例方法和构造函数都可以具有类型参数。
public static <T> T get() {
// Can only legally return null or throw.
...
}
...
System.out.println(X.<Integer>get());
用什么代替?可能是某种抽象的工厂,可能是java.util.function.Supplier
。
虽然类型X
是泛型,但类X
不是。在Java中,没有"泛型类"(只有泛型类型(。最可能的意图是静态方法上的一个通用参数:
private static class X<T> {
public static <T> T get() {
return ...;
}
}
此外,由于泛型被擦除,因此不能实例化T
(因此上面代码中的三个点(。
人们会这样称呼这种方法:
...
X.<SomeConcreteType>get();
我认为供应商可能比静态X<T>.get
:更适合您
public static class aClass {}
public static <T> aMethodWantToUseX(Supplier<T> x) {
T t = x.get();
}
aMethodWantToUseX(aClass::new)