繁体   English   中英

为什么会出现类型不匹配错误?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM