Supongamos que tengo una clase llamada Devil
class Devil y tengo un método llamado support
fun <T> support(t : T){ } Quiero restringir esta función para que solo acepte clases que no sean Devil (todas las clases en el mundo, pero no Devil ). Algo como
fun <T except Devil> support(t : T){ }Es muy probable que se trate de un problema XY, así que no aplique esta solución sin considerar otra cosa.
Una forma de lograr esto es declarar una sobrecarga no genérica de support() con el tipo explícito Devil y desaprobar esa función con el nivel ERROR :
fun <T> support(t: T) { // do your stuff } @Deprecated("support() cannot be used with type Devil", level = DeprecationLevel.ERROR) fun support(devil: Devil) { error("NOPE.") } Tenga en cuenta que esto también excluiría los subtipos de Devil , que no se indica explícitamente en su pregunta, pero podría ser lo que desea.
Sin embargo, nada impide que los usuarios solucionen esto llamando explícitamente a la sobrecarga genérica especificando un tipo en <...> :
support<Devil>(Devil()) // compiles fine support<Any>(Devil()) // compiles fine De manera similar, como señaló @gidds, este enfoque tampoco evita la compilación si pasa una variable con un tipo estático que no es Devil , incluso si contiene una instancia de Devil (porque el compilador elegirá la sobrecarga genérica en ese caso ):
val hiddenDevil: Any = Devil() support(hiddenDevil) // compiles fine