有一個類層次結構:如何強制使用靜態泛型方法的返回類型?
String child = null;
Object parent = child;
如何強制Sets.newHashSet(E...)
返回一個Set<Object>
同時通過String
參數?
有一個類層次結構:如何強制使用靜態泛型方法的返回類型?
String child = null;
Object parent = child;
如何強制Sets.newHashSet(E...)
返回一個Set<Object>
同時通過String
參數?
您可以指定通用的返回類型:
Sets.<Object>newHashSet(child);
也許這將是確定你回來Set<? extends Object>
,那麼你可以把它寫成一個返回類型:
public Set<? extends Object> myMethod() {
return Sets.newHashSet(child);
}
你明確地傳遞類型參數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>
。
newHashSet
總會返回其泛型類型參數的類型。由於child
的類型爲String
,因此編譯器會將泛型類型推斷爲String
,並且函數將返回HashSet<String>
。
你可以簡單地傳遞一個Object
通過代替鑄造child
明確強制編譯器來推斷Object
作爲泛型類型來代替:
Sets.newHashSet((Object) child);
另外,您可以強制泛型類型和編譯器現在可以看到,演員是微不足道的:
Sets.<Object>newHashSet(child);
在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月該呼叫的推斷參數類型,獨自完成。