#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)