泛型类型转换为静态方法



示例非常简单。我想要的是书面的。问题在评论中。

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)

最新更新