返回SELF的java类的对象实例化在kotlin中不起作用

dha*_*sav 5 generics type-inference couchbase kotlin testcontainers

我有一个java类

public class CouchbaseContainer<SELF extends CouchbaseContainer<SELF>>
Run Code Online (Sandbox Code Playgroud)

当我尝试在 kotlin 中为此创建对象时

val couchbase = CouchbaseContainer()
Run Code Online (Sandbox Code Playgroud)

Kotlin 抛出错误

类型推断失败:没有足够的信息来推断构造函数 CouchbaseContainer!> () 中的参数 SELF。请明确说明

但我可以在 Java 中创建这个对象,如下所示:

CouchbaseContainer couchbase = new CouchbaseContainer();
Run Code Online (Sandbox Code Playgroud)

use*_*612 2

问题是,在 Java 字节码中没有泛型的概念(称为类型擦除),因此您的类型SELF不会出现在字节码中。这就是为什么在 Java 中您可以创建实例而不指定 的实际值SELF

不过,在 Kotlin 中,我猜编译器会认为这CouchbaseContainer是通用的,并且需要您提供实际SELF值。事实上,错误消息是这样的:

类型推断失败:没有足够的信息来推断参数 T

constructor Foo<T : Any!>  ( )
Run Code Online (Sandbox Code Playgroud)

请明确指定。

另请注意,如果可以推断类型(例如,因为您通过构造函数传递它),则不需要提供它,如以下示例所示(摘自文档):

class Box<T>(t: T) {
    var value = t
}

val box = Box(1) // T is inferred to be Int
Run Code Online (Sandbox Code Playgroud)