¿Cómo get un KType en Kotlin?

Estoy experimentando con la funcionalidad de reflexión en Kotlin, pero parece que no puedo entender cómo get un valor KType.

Supongamos que tengo una class que mapea frases en fábricas de objects. En caso de ambigüedad, el usuario puede suministrar un parámetro de type que limite la búsqueda a solo las fábricas que devuelven ese tipo de object (o algún subtipo).

 fun mapToFactory(phrase: Phrase, type: KType = Any::class): Any {...} 

type necesita aceptar casi cualquier cosa, incluido Int , que por mi experiencia parece ser tratada de manera especial. Por defecto, debería ser algo como Any , lo que significa "no excluir ninguna fábrica".

¿Cómo puedo asignar un valor pnetworkingeterminado (o cualquier valor) para type ?

Según su descripción, parece que su function debe tomar un parámetro KClass , no un KType , y verificar los objects entrantes con isSubclass , no isSubtype .

Los types (representados por KType en kotlin-reflect ) generalmente provienen de firmas de declaraciones en su código; denotan un amplio set de valores que las funciones toman como parameters o regresan. Un tipo consta de la class, arguments generics para esa class y capacidad de anulación. El problema con los types en time de ejecución en JVM es que, debido a la eliminación, es imposible determinar el tipo exacto de una variable de una class genérica. Por ejemplo, si tiene una list, no puede determinar el tipo genérico de esa list en time de ejecución, es decir, no puede diferenciar entre List<String> y List<Throwable> .

Sin embargo, para responder a su pregunta inicial, puede crear un KType de una KClass con createType() :

 val type: KType = Any::class.createType() 

Tenga en count que si la class es genérica, debe pasar proyecciones de tipo de arguments generics. En casos simples (todas las variables de tipo pueden replacese con proyecciones en estrella), starProjectedType también funcionará. Para get más información sobre createType y starProjectedType , consulte esta respuesta .

  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • ¿Por qué == e iguales producen resultados diferentes?
  • Configurar la reflexión de kotlin, class.java no funciona
  • ¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?
  • String.intern () devuelve diferentes valores en un controller JDBC
  • La igualdad de class Kotlin falla
  • Determinar si una instancia es una instancia de una class de datos
  • ¿Cómo cambiar un campo de miembro con la reflexión de Kotlin?
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • Kotlin: ¿Es aquí una forma inteligente de lanzar NotImplementedError para todos los methods de una class?