uwzględniając hierarchię Klasa:Jak wymusić typ zwrotny metody statycznej?
String child = null;
Object parent = child;
Jak wymusić Sets.newHashSet(E...)
do zwróci Set<Object>
przechodząc String
argumenty?
uwzględniając hierarchię Klasa:Jak wymusić typ zwrotny metody statycznej?
String child = null;
Object parent = child;
Jak wymusić Sets.newHashSet(E...)
do zwróci Set<Object>
przechodząc String
argumenty?
można określić ogólny typ powrotny z:
Sets.<Object>newHashSet(child);
Może byłoby OK, aby powrócić Set<? extends Object>
, to można napisać go jako Zwraca typ:
public Set<? extends Object> myMethod() {
return Sets.newHashSet(child);
}
przekazać argument type wyraźnie do newHashSet
:
Sets.<Object>newHashSet(child);
Jeśli typ argumentu nie przepuszcza wyraźnie typ jest wywnioskować, aw tym przypadku to wynikać z niewłaściwego typu, przypuszczalnie String
.
Wygląda na to, że używasz Guava's Sets. Podpis metody jest następujący:
public static <E> HashSet<E> newHashSet()
Jak widać newHashSet()
przyjmuje parametr typu E
. Wynikiem jest HashSet<E>
. E
jest określany jako String
, ale określono metodę zwracania Set<Object>
. Rozwiązaniem jest albo pomóc kompilatorowi, albo zmniejszyć ograniczenie w typie zwracanym do Set<? extends Object>
.
newHashSet
zawsze zwraca typ swojego argumentu typu ogólnego. Ponieważ typ child
to String
, kompilator wywnioskuje typ ogólny jako String
, a funkcja zwróci wartość HashSet<String>
.
można po prostu przekazać mu Object
zamiast oddając child
explicite zmusić kompilator wywnioskować Object
jako typ rodzajowy Zamiast:
Sets.newHashSet((Object) child);
Alternatywnie można wymusić typu rodzajowego i kompilator może teraz zobaczyć, że obsada jest trywialna:
Sets.<Object>newHashSet(child);
W języku Java 8 kompilacja ta jest w porządku; wnioskowanie uwzględnia typ celu.
public Set<Object> myMethod() {
return Sets.newHashSet(child);
}
Korzystanie JDK API:
public Set<Object> myMethod() {
return Collections.singleton(child); // Works too
}
W Javie 5, 6, 7 wnioskowanie na tej rozmowy odbywa się na typy argumentów sam.