簡體   English   中英

派生為對象返回類型的Java通用返回類型方法

[英]Java Generic return type method derived to be object return type

我遇到了這個有線問題。

class Foo<R, C> {

    public C fooMethod() {
        Bar bar = new Bar();
        Map<String, String> m = new HashMap<>();
        return bar.barMethod(m);
    }
}

class Bar {
    public <T> T barMethod(Map<String, String> m) {
        Object barObj = null;
        ...
        return (T) barObj;
    }
}

如果我聲明m為原始類型Map m = new Map() ,則會出現編譯錯誤:

不兼容的類型:無法將對象轉換為C,其中C是類型變量。

但是如果m是上面聲明的類型化對象,則編譯錯誤消失了。

我不知道為什么參數會使編譯器弄清楚返回類型是什么。 對我而言,編譯器在任何情況下都不應將Bar類示例中的泛型T視為對象類型。 有人可以指出我錯了嗎? 提前致謝。

Map m = new HashMap<>();
return bar.barMethod(m); //error

拋出錯誤是因為barMethod(Map<String, String> m)特別需要Map<String, String> 您可以做一些事情來使編譯錯誤失效。

  • barMethod參數更改為原始類型。

     public <T> T barMethod(Map m) {...} 

    要么

  • 在方法fooMethod返回值fooMethodC

     return (C) bar.barMethod(m); 

    要么

  • 將方法fooMethod的返回類型更改為Object

     public Object fooMethod() 

我在規范中找不到任何來源,但是基本上,因為您已經使用了原始類型Map來代替通用Map<String, String> ,所以Java會將所有通用參數(而不僅僅是Map )轉換為類型擦除的Object 方法簽名有效地變為:

public Object barMethod(Map<Object, Object> m)

由於barMethod返回一個Object ,並且Object不一定是C (由fooMethod返回),因此類型不兼容。 這就是為什么這會導致編譯器錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM