Determinar si una instancia es una instancia de una class de datos

Dadas las siguientes classs

abstract class SomeAbstractClass { abstract val name: String } data class DataClass( override val name: String ) : SomeAbstractClass() class NoDataClass( override val name: String ) : SomeAbstractClass() 

Para cualquier instancia de SomeAbstractClass , ¿puedo determinar si se trata de una class de datos sin depender de la verificación de types?

Algunos antecedentes: esta me pareció la mejor forma de combinar classs de inheritance y datos, como se sugiere en una respuesta diferente . Ahora, dentro del bloque inicializador de SomeAbstractClass , deseo lanzar una exception en caso de que el tipo derivado no sea una class de datos para garantizar implementaciones 'correctas' (inmutables) de types derivados.

Usando la reflexión , la descripción de la class Kotlin ( KClass ) se puede get usando la syntax ::class en la instancia que desea investigar (en su caso, this::class en el bloque de initialization de la class abstracta). Esto le da acceso a isData :

verdadero si esta class es una class de datos.

Sin embargo, como señala Oliver , las classs de datos todavía pueden contener miembros var , por lo que también es probable que desee comprobar si todas las variables miembro (y sus variables miembro recursivamente) se definen como val para garantizar la inmutabilidad de todas las classs derivadas.

  • Obtén la function por nombre dinámicamente en Kotlin
  • ¿Es seguro llamar a kclass.memberProperties en un object desconocido (Cualquiera)?
  • Obteniendo la class actual
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • por qué SomeClass :: class es KClass <SomeClass> pero esta :: class es KClass <out SomeClass>
  • ¿Cómo get una class de time de ejecución de una variable en Kotlin?
  • La delegación de propiedad kotlin alias lanza Exception
  • Los literales de class Kotlin con el lado izquierdo vacío aún no son compatibles.
  • Interoperabilidad de reflexión de Kotlin con Java
  • Llamadas a function de logging usando reflexión en kotlin
  • ¿Cómo puedo get una reference a un object Kotlin por su nombre?