El parámetro de tipo Force es invariante en el sitio de uso cuando es covariante en el sitio de statement

Estoy construyendo una function de extensión en KProperty1 . La function necesita aceptar un argumento que amplíe el tipo de valor de la propiedad ( R ), aunque KProperty1 sea ​​covariante en el parámetro de tipo R

Un ejemplo ligeramente artificial sería el siguiente, aunque mi uso es más legítimo.

 data class Data(val value: String) fun <V> KProperty1<*, V>.setMagically(value: V) { this.javaField?.set(null, value) } fun test() { // I would like this to fail to compile Data::value.setMagically(190) } 

Parece que el comstackdor está deduciendo el tipo Any para R , que es totalmente válido, ya que KProperty1<*, String> : KProperty1<*, Any>

Lo que quiero es decir que para mi caso particular, realmente quiero que V sea ​​invariante. Sé que puedes usar out y in como ampliadores de varianza, pero no pude averiguar cómo especificar que quiero anular la anotación covariante en KProperty1 con invarianza para este caso.

Vale la pena señalar que funciona muy bien con KMutableProperty1 , ya que es invariante en R Pero mi código también debe funcionar con properties no mutables.

Para el context, estoy creando algo que genera consultas de bases de datos, por lo que necesito que el valor sea una subclass del tipo de propiedad, aunque no estoy escribiendo en la propiedad, pero esta pregunta es más general que mi específica , caso de event handling properties.

Esto no es posible actualmente en Kotlin. De hecho, hay una anotación interna que habilita este comportamiento (hace que el comstackdor informe un error, si se infiere Any aunque no se mencionó en el sitio de llamadas) y se usa en varios lugares en kotlin-stdlib , pero usándolo fuera de la biblioteca estándar aún se desaconseja.

Tenemos planes para hacer esta anotación pública. Para get más información, echa un vistazo a KT-13198 .