我一直在尝试使用泛型返回地图:
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 {
}
在我返回地图的行中,我收到错误
Type mismatch: cannot convert from Map<String,Car> to Map<String,T>
有人可以解释为什么吗?
在我提到的返回类型中,T扩展了Vehicle。
答案 0 :(得分:6)
因为您可以致电Map<String, Truck> map = new GenericTest().get();
。 Map<String, Car>
不是Map<String, Truck>
。
将变量声明更改为:
Map<String, T> map = new HashMap<>();
或将方法签名更改为:
public Map<String, Car> get()
答案 1 :(得分:3)
这是一种常见的误解,即泛型参数由被调用者(方法)决定,而不是调用者。
实际上,通用参数由调用者确定,即当您调用方法时:
Map<String, Bus> myMap = get(); // Now "T" is "Bus".
这就是错误发生的原因。作为调用者,我可以将Vehicle
指定为T
,但该方法只能返回Map<String, Car>
,这与Map<String, Bus>
不兼容。
要执行您要执行的操作,请将返回类型更改为Map<String, ? extends Vehicle>
。
答案 2 :(得分:1)
您将返回类型定义为泛型但返回具体对象的地图。根据您的方法签名public <T extends Vehicle> Map<String, T> get()
,您可以将返回值分配给Vehicle
的任何子类的地图作为值,将key
作为String
分配,但是因为您要返回Map<String, Car>
你不能这样做。
因此您需要将地图更改为Map<String, T> map = new HashMap<>()
答案 3 :(得分:0)
public class GenericTest {
public <T extends Vehicle> Map<String, T> get() {
Map<String, T> map = new HashMap<>();
return map;
}
}
类车辆{ }
类Car扩展车辆{ }
然后你调用这样的方法 Map map = new GenericTest()。get();