为什么我会收到类型不匹配错误?

时间:2018-05-19 07:35:53

标签: java generics

我一直在尝试使用泛型返回地图:

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。

4 个答案:

答案 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();