调用静态泛型方法

129

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

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

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

    public Bar()
    {
        member = Foo.createFoo();
    }
}

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


8
我建议您更改createFoo方法的类型参数E,因为类Foo的类型参数E与createFoo()方法的类型参数E不同。 - Gursel Koca
@GurselKoca 他可以明确地执行 member = Foo.<E>createFoo(); 要求它们与编译时相同。 - George Xavier
1个回答

218

是的,这是基于赋值目标的类型推断,根据JLS第15.12.2.8节规定。为了明确,您可以这样调用:

Foo.<String>createFoo();

3
或者,就像我的情况一样:Foo.<E>createFoo(); 谢谢 :) - fredoverflow
7
没有赋值语句,为什么这个也能工作呢?也就是说,语句 Foo.createFoo(); 能够成功编译……这是因为类型擦除造成的吗? - fredoverflow
12
没有赋值语句时,变量 E 的类型会被“推断”为 Object - irreputable
3
新的链接位置可能是:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13.2。 - Joanis
3
另一种指定E类型的方法是定义createFoo()函数,使其接受一个Class<E>类型的参数(即createFoo(Class<E> type)),并通过createFoo(String.class)进行调用。 - Gavin S. Yancey
调用此方法的完整语法: https://docs.oracle.com/javase/tutorial/java/generics/methods.html - Grigory Kislin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接