T 除了一个 class

T except one class

假设我有一个名为 Devil

的 class
class Devil

我已经调用了 support

方法
fun <T> support(t : T){

}

我想限制这个函数只接受classes而不是Devil(世界上所有classes,但不接受Devil)。像

fun <T except Devil> support(t : T){

}

这很可能是 XY 问题,因此请不要在不考虑其他问题的情况下应用此解决方案。

实现此目的的一种方法是使用显式类型 Devil 声明 support() 的 non-generic 重载,并弃用 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.")
}

请注意,这也会排除 Devil 的子类型 - 这在您的问题中没有明确说明,但可能是您想要的。

但是,没有什么可以阻止用户通过在 <...> 中指定类型来显式调用泛型重载来解决它:

support<Devil>(Devil()) // compiles fine
support<Any>(Devil()) // compiles fine

同样,正如@gidds 指出的那样,如果您传入的静态类型不是 Devil 的变量即使它包含 [=14= 的实例,这种方法也不会阻止编译](因为在那种情况下编译器会选择泛型重载):

val hiddenDevil: Any = Devil()
support(hiddenDevil) // compiles fine