2015-06-24 15 views

Antwort

17

Sie generischen Rückgabetyp mit angeben:

Sets.<Object>newHashSet(child); 

Vielleicht wäre es OK für Sie Set<? extends Object> zurückkehren, dann können Sie es als Rückgabetyp schreiben:

public Set<? extends Object> myMethod() { 
    return Sets.newHashSet(child); 
} 
7

Sie passieren das Typargument explizit newHashSet:

Sets.<Object>newHashSet(child); 

Wenn der Typ Argument nicht übergeben wird ausdrücklich die Art geschlossen wird, und in diesem Fall ist es zu dem falschen Typ abgeleitet, vermutlich String.

Es scheint, dass Sie Guava's Sets verwenden. Die Methodensignatur ist die folgende:

public static <E> HashSet<E> newHashSet() 

Wie Sie newHashSet() nimmt einen Typparameter E sehen können. Das Ergebnis ist HashSet<E>. E wird als String gewertet, aber Sie haben die Methode angegeben, um Set<Object> zurückzugeben. Die Lösung besteht darin, entweder dem Compiler zu helfen oder die Einschränkung im Rückgabetyp auf Set<? extends Object> zu lockern.

3

newHashSet werden immer Gibt den Typ des generischen Arguments zurück. Da der Typ childString ist, wird der Compiler den generischen Typ als String ableiten, und die Funktion gibt HashSet<String> zurück.

können Sie einfach passieren sie einen Object anstelle von child Gießen explizit den Compiler zu erzwingen Object als gattungs statt zu schließen:

Sets.newHashSet((Object) child); 

Alternativ können Sie den generischen Typ erzwingen und der Compiler kann nun sehen, dass Die Besetzung ist trivial:

Sets.<Object>newHashSet(child); 
3

In Java 8, kompiliert dies einfach gut; Die Inferenz berücksichtigt den Zieltyp.

public Set<Object> myMethod() { 
    return Sets.newHashSet(child); 
} 

Mit JDK API:

public Set<Object> myMethod() { 
    return Collections.singleton(child); // Works too 
} 

In Java 5, 6, 7 der Schlußfolgerung auf diesen Aufruf auf Argumenttypen allein gemacht wird.

Verwandte Themen