[英]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
返回值fooMethod
為C
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.