Prevent Kotlin from forcing Java to see a wildcard type

Viewed 3783

This works fine:

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())

But, when I try to access Wrapper2.wrap from Java, the Map comes back with a wildcard type:

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

I can work around this by overriding wrap in Wrapper2 with the explicit type.

Why does Wrapper2.wrap return a different type than Wrapper.wrap?

2 Answers
Related