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() } } } 

我希望能够做的是这样的,但它不工作:

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

我怎样才能做类似于这个,而不必改变接口,这是在不同的模块,不能轻易改变?

星型投影在使用通用接口时非常有用,而且在定义实现时很少。 (类似于Java的? )。

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

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

https://kotlinlang.org/docs/reference/generics.html

根据文档,在你的例子中的V等不变类型的星形投影可以解决。 如果T参数不是自引用的,你可以使用:

 object : Generic<Any, Any> {} 

由于T是自引用的,所以你需要为T引用实际定义一个命名类。

 class Test { val v2 : Generic<*, *> init { class Impl: Generic<Any, Impl> { override fun stuff(x: Any) { // ... } } v2 = Impl() } } 

另一个可能性是创建一个接口,为您解析自引用泛型。

 interface SelfRef<V> : Generic<V, SelfRef<V>> class Test2 { val v = object: SelfRef<Any> { override fun stuff(x: Any) { } } }