假设我有一门课叫Devil
class Devil
我把这个方法叫做support
fun <T> support(t : T){
}
我想限制这个函数只接受Devil
以外的类(世界上所有的类,但不是Devil
).差不多
fun <T except Devil> support(t : T){
}
- 在Kotlin 我该怎么做?这可能吗?
假设我有一门课叫Devil
class Devil
我把这个方法叫做support
fun <T> support(t : T){
}
我想限制这个函数只接受Devil
以外的类(世界上所有的类,但不是Devil
).差不多
fun <T except Devil> support(t : T){
}
This is very likely an XY problem, so please do not apply this solution without considering something else.
实现这一点的一种方法是使用显式类型Devil
声明非泛型重载support()
,并使用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
的变量,即使它包含Devil
的实例,这种方法也不会阻止编译(因为在这种情况下编译器将 Select 泛型重载):
val hiddenDevil: Any = Devil()
support(hiddenDevil) // compiles fine