调用静态通用方法


106

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

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

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

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

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


7
我建议您更改createFoo方法的类型参数E。因为,类Foo的类型参数E与方法createFoo()的类型参数E不同。
Gursel Koca

@GurselKoca他可以明确地执行member = Foo。<E> createFoo();。要求它们与编译时间相同。
乔治Xavier

Answers:


183

是的,根据JLS第15.12.2.8节,这是基于分配目标的类型推断。明确地说,您可以这样称呼:

Foo.<String>createFoo();

3
或者,以我的情况Foo.<E>createFoo();
为例

7
没有分配,这也怎么起作用?也就是说,该语句 Foo.createFoo();可以很好地编译...?这是由于类型擦除引起的吗?
fredoverflow 2011年

9
@FredOverflow没有分配E被“推论”为Object
无可辩驳的2011年

2
新链接的位置很可能是:docs.oracle.com/javase/specs/jls/se8/html/...
Joanis

3
指定类型的另一种方法E是定义createFoo()接受类型的参数Class<E>(也就是createFoo(Class<E> type)),并用createFoo(String.class)
Gavin S. Yancey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.