Evite que Kotlin fuerce a Java a ver un tipo de comodín

Esto funciona bien:

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

Pero, cuando bash acceder a Wrapper2.wrap desde Java, el map vuelve con un tipo de comodín:

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

Puedo evitar esto reemplazando wrap en Wrapper2 con el tipo explícito.

¿Por qué Wrapper2.wrap devuelve un tipo diferente de Wrapper.wrap ?

Puede suprimir Kotlin usando comodines en generics como se describe en la reference de Kotlin donde describe la anotación @JvmSuppressWildcards (o el reverso de la anotación @JvmWildcard ).

De los documentos:

Por otro lado, si no necesitamos comodines donde se generan, podemos usar @JvmSuppressWildcards :

 fun unboxBase(box: Box<@JvmSuppressWildcards Base>): Base = box.value // is translated to // Base unboxBase(Box<Base> box) { ... } 

NOTA: @JvmSuppressWildcards se puede usar no solo en arguments de tipo individuales, sino en declaraciones completas, como funciones o classs, lo que hace que se supriman todos los comodines dentro de ellos.

Cambio

 class Wrapper2 : Wrapper<Map<String, String>>() 

a

 class Wrapper2 : Wrapper<MutableMap<String, String>>() 

Verás en la fuente de Kotlin,

 public interface Map<K, out V> { 

mientras:

 public interface MutableMap<K, V> : Map<K, V> { 

Creo out V es la razón por la que estás recibiendo ? extends String ? extends String , consulte Covarianza en los documentos de generics para Kotlin y una búsqueda rápida en Google debería proporcionarle más información sobre la covarianza y la contradicción en Java .

  • ClassCastException: android.inputmethodservice.KeyboardView no se puede convertir a com.support.mukhtar.simplekeyboard.CustomKeyboardView android
  • ¿Hay alguna forma less fea de regresar a la function en Kotlin?
  • ¿Por qué la llamada insegura .run () funciona bien en un valor nulo en Kotlin?
  • Proguard y Kotlin-Reflect / Kotlin Anotaciones
  • Cómo componer nulables en Kotlin
  • Configure Jackson para usar SNAKE_CASE "globalmente" en Spring Boot 2.0.0.M1
  • Usando hbm2ddl con gerentes de entidades duales en Hibernate
  • Prueba RxJava2 Flowable Query Room
  • Dagger 2 no genera la class de componente (Android, Kotlin)
  • getChildFragmentManager () no encontrado en kotlin
  • No se pueden agregar las extensiones de Kotlin para Android a mi proyecto