2015-06-24 44 views

回答

17

您可以指定通用的返回類型:

Sets.<Object>newHashSet(child); 

也許這將是確定你回來Set<? extends Object>,那麼你可以把它寫成一個返回類型:

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

你明確地傳遞類型參數newHashSet

Sets.<Object>newHashSet(child); 

如果類型參數沒有通過明確的類型推斷,在這種情況下,它推斷錯誤的類型,想必String

看來你正在使用Guava's Sets。該方法的簽名如下:

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

正如你可以看到newHashSet()需要一個類型參數E。結果是HashSet<E>E被推斷爲String,但您已指定返回Set<Object>的方法。解決方法是幫助編譯器或將返回類型的限制解除爲Set<? extends Object>

3

newHashSet總會返回其泛型類型參數的類型。由於child的類型爲String,因此編譯器會將泛型類型推斷爲String,並且函數將返回HashSet<String>

你可以簡單地傳遞一個Object通過代替鑄造child明確強制編譯器來推斷Object作爲泛型類型來代替:

Sets.newHashSet((Object) child); 

另外,您可以強制泛型類型和編譯器現在可以看到,演員是微不足道的:

Sets.<Object>newHashSet(child); 
3

在Java 8中,這個編譯得很好;推斷考慮了目標類型。

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

使用JDK的API:

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

在Java 5,6,7月該呼叫的推斷參數類型,獨自完成。