Kotlin 对象字面量实现通配符、自引用通用接口

Yon*_*ree 3 generics kotlin

我有一个接口(Java 中),它采用自引用泛型参数,我想在 Kotlin 中创建一个实现它的对象文字。在 Java 中,我通过不包含泛型类型(不安全)来做到这一点,但我不知道如何在 Kotlin 中做到这一点。

这是一个仅用 Kotlin 编写的示例,但在我的例子中,接口是用 Java 编写的。

interface Generic<V, T : Generic<V, T>> {
    fun stuff(x: V)
}

class Test {
    // In Java I would write new Generic() { ... }
    val v = object : Generic<*, *> {
        override fun stuff(x: Object) {
            doSomethingThatDoesntCareAboutTypes()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是这样的事情,但它不起作用:

val v = object<T : Generic<*, T>> : T {
    override fun stuff(x: Object) {
        doSomethingThatDoesntCareAboutTypes()
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做类似的事情而不需要更改接口,该接口位于不同的模块中并且不能轻易更改?

mie*_*sol 5

星形投影在使用通用接口时特别有用,但在定义实现时很少有用。(与Java类似?)。

为了能够定义一个object实现,Generic您需要提供满足约束的类型参数。Nothing特别是所有 Kotlin 类型的子类型,因此您可以编写:

val v = object : Generic<Any, Nothing> {
    override fun stuff(x: Any) {
        doSomethingThatDoesntCareAboutTypes()
    }
}
Run Code Online (Sandbox Code Playgroud)