2015-06-24 11 views

Odpowiedz

17

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); 
} 
7

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>.

3

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); 
3

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.

Powiązane problemy