Natknąłem się na ciekawą sytuację związaną ze statycznymi metodami ogólnymi. To jest kod:
class Foo<E>
{
public static <E> Foo<E> createFoo()
{
// ...
}
}
class Bar<E>
{
private Foo<E> member;
public Bar()
{
member = Foo.createFoo();
}
}
Dlaczego nie muszę określać żadnych argumentów typu w wyrażeniu Foo.createFoo()
? Czy to jakiś rodzaj wnioskowania o typie? Jeśli chcę to wyraźnie określić, jak mogę określić argument typu?
java
generics
static
type-inference
fredoverflow
źródło
źródło
Odpowiedzi:
Tak, jest to wnioskowanie o typie na podstawie celu przypisania, zgodnie z sekcją JLS 15.12.2.8 . Mówiąc wprost, nazwałbyś coś takiego:
źródło
Foo.<E>createFoo();
dziękuję :)Foo.createFoo();
kompiluje się dobrze ...? Czy jest to spowodowane wymazywaniem typu?E
jest „wywnioskowany” jakoObject
E
byłoby zdefiniowaniecreateFoo()
weź argument typuClass<E>
(tak by byłocreateFoo(Class<E> type)
) i wywołanie go za pomocącreateFoo(String.class)