[英]Why am I getting Type mismatch error?
我一直在嘗試使用泛型返回Map:
import java.util.HashMap;
import java.util.Map;
public class GenericTest {
public <T extends Vehicle> Map<String, T> get() {
Map<String, Car> map = new HashMap<>();
return map; // Getting error
}
}
class Vehicle {
}
class Car extends Vehicle {
}
在返回map的行中,出現錯誤
Type mismatch: cannot convert from Map<String,Car> to Map<String,T>
有人可以解釋為什么嗎?
在返回類型中,我提到T擴展了Vehicle。
因為您可以調用Map<String, Truck> map = new GenericTest().get();
。 而且Map<String, Car>
不是Map<String, Truck>
。
將變量聲明更改為:
Map<String, T> map = new HashMap<>();
或將方法簽名更改為:
public Map<String, Car> get()
這是一個普遍的誤解,認為通用參數是由被調用方(方法)而不是調用方確定的。
實際上,泛型參數由調用方確定,即在您調用方法時:
Map<String, Bus> myMap = get(); // Now "T" is "Bus".
這就是為什么會發生錯誤。 作為調用者,我可以將任何Vehicle
指定為T
,但是該方法只能返回Map<String, Car>
,而Map<String, Car>
與Map<String, Bus>
不兼容。
要執行您想做的事情,請將返回類型更改為Map<String, ? extends Vehicle>
Map<String, ? extends Vehicle>
。
您將返回類型定義為泛型,但返回具體對象的地圖。 根據您的方法簽名public <T extends Vehicle> Map<String, T> get()
您可以將返回的值分配給Vehicle
的任何子類的map作為值,並將key
作為String
但是由於您要返回Map<String, Car>
無法做到這一點。
因此您需要將map更改為Map<String, T> map = new HashMap<>()
公共類GenericTest {
public <T extends Vehicle> Map<String, T> get() {
Map<String, T> map = new HashMap<>();
return map;
}
}
車輛類{}
汽車擴展車輛{}類
然后,調用像這樣的方法 Map map = new GenericTest()。get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.