调用静态泛型方法

Calling static generic methods

提问人:fredoverflow 提问时间:3/14/2011 更新时间:6/18/2015 访问量:88340

问:

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

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

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

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

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

Java 泛型静态 类型推理

评论

8赞 Gursel Koca 3/14/2011
我建议您更改 createFoo 方法的类型参数 E。因为 ,类 Foo 的类型参数 E 与方法 createFoo() 的类型参数 E 不同。
0赞 George Xavier 6/21/2019
@GurselKoca 他可以明确地做 member = Foo.<E>createFoo();要求它们与编译时相同。

答:

218赞 Jon Skeet 3/14/2011 #1

是的,这是根据 JLS 第 15.12.2.8 节基于赋值目标的类型推断。为了明确起见,您可以这样称呼:

Foo.<String>createFoo();

评论

3赞 fredoverflow 3/14/2011
或者,就像我的情况一样:谢谢你:)Foo.<E>createFoo();
7赞 fredoverflow 3/14/2011
为什么没有分配也能工作?也就是说,该语句编译得很好......?这是由于类型擦除造成的吗?Foo.createFoo();
12赞 irreputable 3/15/2011
没有赋值的@FredOverflow被“推断”为EObject
3赞 Joanis 11/28/2014
新的链接位置可能是:docs.oracle.com/javase/specs/jls/se8/html/...
3赞 Gavin S. Yancey 4/16/2015
指定 type 的另一种方法是定义 获取 type 的参数(所以它是 ),然后用EcreateFoo()Class<E>createFoo(Class<E> type)createFoo(String.class)