這工作得很好:防止科特林從迫使Java來看看一個通配符類型
class Wrapped<out T>(val value: T)
open class Wrapper<T> {
fun wrap(map: T): Wrapped<T> = Wrapped(map)
}
class Wrapper2 : Wrapper<Map<String, String>>()
val wrapped: Wrapped<Map<String, String>> = Wrapper2().wrap(mapOf())
但是,當我試圖從Java訪問Wrapper2.wrap
,地圖回來了通配符類型:
Map<String, String> toWrap = new HashMap<>();
Wrapped<Map<String, String>> result;
result = new Wrapper<Map<String, String>>().wrap(toWrap); // ok
result = new Wrapper2().wrap(toWrap); // NOT ok, returns Wrapped<Map<String, ? extends String>>
我可以通過在Wrapper2
中用明確類型重寫wrap
來解決此問題。
爲什麼Wrapper2.wrap
返回與Wrapper.wrap
不同的類型?
是的,這就是爲什麼Kotlin(不可變)'Map <>'表現的方式,謝謝! – gladed