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){
}
- 我如何在 Kotlin 中执行此操作?这可能吗?
这很可能是 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
假设我有一个名为 Devil
class Devil
我已经调用了 support
fun <T> support(t : T){
}
我想限制这个函数只接受classes而不是Devil
(世界上所有classes,但不接受Devil
)。像
fun <T except Devil> support(t : T){
}
- 我如何在 Kotlin 中执行此操作?这可能吗?
这很可能是 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