[英]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.