Я столкнулся с любопытной ситуацией, связанной со статическими универсальными методами. Это код:
class Foo<E>
{
public static <E> Foo<E> createFoo()
{
// ...
}
}
class Bar<E>
{
private Foo<E> member;
public Bar()
{
member = Foo.createFoo();
}
}
Почему мне не нужно указывать аргументы типа в выражении Foo.createFoo()
? Это что-то вроде вывода типа? Если я хочу четко указать на это, как я могу указать аргумент типа?
java
generics
static
type-inference
fredoverflow
источник
источник
Ответы:
Да, это вывод типа на основе цели назначения, согласно разделу 15.12.2.8 JLS . Чтобы быть точным, вы бы назвали что-то вроде:
источник
Foo.<E>createFoo();
Спасибо :)Foo.createFoo();
компилируется нормально ...? Это из-за стирания типа?E
«предполагается»Object
E
это определить,createFoo()
принять аргумент типаClass<E>
(так оно и былоcreateFoo(Class<E> type)
), и вызвать его с помощьюcreateFoo(String.class)