调用静态泛型方法

fre*_*low 96 java generics static type-inference

我遇到了一个涉及静态泛型方法的奇怪情况.这是代码:

class Foo<E>
{
    public static <E> Foo<E> createFoo()
    {
        // ...
    }
}

class Bar<E>
{
    private Foo<E> member;

    public Bar()
    {
        member = Foo.createFoo();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我不必在表达式中指定任何类型参数Foo.createFoo()?这是某种类型推断吗?如果我想明确它,我如何指定类型参数?

Jon*_*eet 164

是的,这是基于分配目标的类型推断,根据JLS第15.12.2.8节.要明确,你会打电话给:

Foo.<String>createFoo();
Run Code Online (Sandbox Code Playgroud)

  • 没有赋值"E"的@FredOverflow被"推断"为"对象" (9认同)
  • 为什么没有这项任务也会如此?也就是说,*语句*`Foo.createFoo();`编译得很好......?这是由于类型擦除? (7认同)
  • 或者,在我的情况下:`Foo.<E> createFoo();`谢谢:) (3认同)
  • 指定`E`类型的另一种方法是定义`createFoo()`接受类型为`Class <E>`的参数(因此它将是`createFoo(Class <E> type)`),并调用它与`createFoo(String.class)` (3认同)
  • 新的链接位置可能是:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13.2 (2认同)