Вызов статических универсальных методов

#java #generics #static #type-inference

#java #универсальные методы #статический #вывод типа

Вопрос:

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

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

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

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

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

Комментарии:

1. Я бы рекомендовал вам изменить параметр типа E метода createFoo. Поскольку параметр типа E класса Foo отличается от параметра типа E метода createFoo().

2. @GurselKoca Он мог бы явно выполнить member = Foo.<E>createFoo(); требуя, чтобы они совпадали со временем компиляции.

Ответ №1:

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

 Foo.<String>createFoo();
  

Комментарии:

1. Или, как в моем случае: Foo.<E>createFoo(); Спасибо 🙂

2.Почему это также работает без назначения? То есть оператор Foo.createFoo(); компилируется просто отлично …? Связано ли это со стиранием типа?

3. @FredOverflow без присваивания E «предполагается», что Object

4. Вероятно, новым расположением ссылки будет: docs.oracle.com/javase/specs/jls/se8/html /…

5. Другим способом указать тип E было бы определить, createFoo() принять аргумент типа Class<E> (так оно и было бы createFoo(Class<E> type) ), и вызвать его с createFoo(String.class)