簡體   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