假设我有一门课叫Devil

class Devil

我把这个方法叫做support

fun <T> support(t : T){

}

我想限制这个函数只接受Devil以外的类(世界上所有的类,但不是Devil).差不多

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

}
  • 在Kotlin 我该怎么做?这可能吗?

推荐答案

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

Kotlin相关问答推荐

判断字符串是否除了.&" ",","@""""

Regex(Kotlin)仅匹配句子末尾的句号,而忽略中间的句号,如缩写

为什么";";.equals(1)在柯特林语中是有效的,但";";=1是无效的?

在Kotlin中的嵌套when语句中,else块是强制性的吗?

在 Kotlin 中将两个字节转换为 UIn16

kotlin 如何决定 lambda 中的参数名称?

Kotlin JS JSON 反序列化

Kotlin 插件错误:无法为类 org.jetbrains.kotlin.gradle.tasks.KotlinCompile 生成代理类

基类中的 ViewModelProviders.get(...)

Fragment的onDestroy()中是否需要将ViewBinding设置为null?

如何使 TextInputEditText 只读?

为什么 Dialog 没有 NavController [Missing]?

ActivityOptions.makeSceneTransitionAnimation 在具有多个视图的 kotlin 中不起作用

Kotlin如何分派invoke操作符?

使用范围的稀疏sparse值列表

添加抽象的私有getter和公共setter的正确方法是什么?

Kotlin:如何从另一个类访问字段?

Kotlin 对象 vs 伴生对象(companion-object) vs 包作用域(package scoped)方法

项目不会使用 Kotlin 1.1.3 构建

RxJava - 每秒发出一个 observable