¿Cómo prohibir las llamadas a funciones con un cierto subtipo de un tipo de parámetro?

Supongamos que tengo una function genérica:

fun <T: Foo> bar(t: T) { ... } 

Luego, más tarde en algún momento, decidí que no tiene sentido (o incluso es erróneo) llamar a la bar(...) con T especializada como Qux , que es, por supuesto, uno de los subtypes de Foo . Pero tengo una fuerte razón para no cambiar la jerarquía de classs (por ejemplo, no tengo acceso a ese código).

¿Hay alguna forma de prohibir las llamadas a bar(t) con T especializado como Qux ?

Hay una forma de prohibir las llamadas para un cierto argumento de tipo genérico: la desaprobación. Usar la anotación @Deprecated en este caso parece bastante torpe, pero resuelve el problema (*).

Puede definir una sobrecarga de bar(...) con un tipo más concreto y descartar la sobrecarga con nivel DeprecationLevel.ERROR :

 @Deprecated("bar should not be called with Qux", level = DeprecationLevel.ERROR) fun <T : Qux> bar(t: T) = bar(t as Foo) 

Después de eso, cuando se resuelve una llamada de bar(...) para un argumento Qux , la sobrecarga obsoleta tendrá prioridad porque presenta más types concretos. Por lo tanto, las llamadas producirán un error en time de compilation:

 bar(Qux()) ^ Using 'bar(T): Unit' is an error. bar should not be called with Qux 

(*) Tenga en count, sin embargo, que esto solo funcionará para Qux como tipo estático (el usado para la resolución de la llamada), y la function todavía se puede llamar como bar(Qux() as Foo) . Muy esperado, no puede producir un error en time de compilation si el tipo de argumento solo se conoce en time de ejecución.


El mismo enfoque puede usarse para producir errores o advertencias para funciones que solo deberían reactjsr en null s de alguna manera, por lo que llamarlas con un tipo no nulo no tiene sentido:

 fun checkNotNull(x: Any?) = x ?: throw IllegalStateException("Should not be null") @Deprecated("It is meaningless with a not-null argument.", DeprecationLevel.WARNING) @JvmName("checkNotNull--notNullArgument") fun checkNotNull(x: Any) = checkNotNull(x as Any?) 
  • Pasando 'esto' a un Constructor
  • Tipos incompatibles: A y kotlin.reflect.KType
  • illegalArgumentsException en super.onCreate (saveInstanceState) en Kotlin
  • Ordenar colección por múltiples campos en Kotlin
  • LocalDateTime en IntelliJ IDEA Kotlin muestra como reference no resuelta
  • Kotlin sincronizado
  • Firebase-Firestre no carga la información de 2 documentos simultáneamente
  • Error al usar IntDef definido en Kotlin cuando se usa en Java
  • No se pasó ningún valor para el elemento de parámetro
  • lanza Exception en un método con Kotlin
  • TornadoFX filechooser