Encontrei uma situação curiosa envolvendo métodos genéricos estáticos. Este é o código:
class Foo<E>
{
public static <E> Foo<E> createFoo()
{
// ...
}
}
class Bar<E>
{
private Foo<E> member;
public Bar()
{
member = Foo.createFoo();
}
}
Por que não preciso especificar nenhum argumento de tipo na expressão Foo.createFoo()
? Isso é algum tipo de inferência de tipo? Se eu quiser ser explícito sobre isso, como posso especificar o argumento de tipo?
java
generics
static
type-inference
fredoverflow
fonte
fonte
Respostas:
Sim, esta é a inferência de tipo com base no destino da atribuição, conforme a seção 15.12.2.8 do JLS . Para ser explícito, você chamaria algo como:
fonte
Foo.<E>createFoo();
Obrigado :)Foo.createFoo();
compila muito bem ...? Isso é devido ao apagamento do tipo?E
é "inferido" como sendoObject
E
seria definircreateFoo()
pegar um argumento do tipoClass<E>
(assim seriacreateFoo(Class<E> type)
) e chamá-lo comcreateFoo(String.class)