Вызов статических общих методов

Я столкнулся с любопытной ситуацией, включающей статические общие методы. Это код:

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

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

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

Почему мне не нужно указывать какие-либо аргументы типа в выражении Foo.createFoo()? Это какой-то тип вывода? Если я хочу быть явным, как указать аргумент типа?

Ответ 1

Да, это вывод типа, основанный на цели назначения, согласно JLS-раздел 15.12.2.8. Чтобы быть явным, вы вызывали бы что-то вроде:

Foo.<String>createFoo();