5

我有一个java类

public class CouchbaseContainer<SELF extends CouchbaseContainer<SELF>>

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

val couchbase = CouchbaseContainer()

Kotlin 抛出错误

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

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

CouchbaseContainer couchbase = new CouchbaseContainer();
4

2 回答 2

4

尝试这个:

class KCouchbaseContainer : CouchbaseContainer<KCouchbaseContainer>()
val couchbase = KCouchbaseContainer()
于 2018-08-21T04:56:17.190 回答
2

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

不过,在 Kotlin 中,我猜编译器认为这CouchbaseContainer是通用的,它需要您提供实际SELF值。实际上,错误消息类似于:

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

constructor Foo<T : Any!>  ( )

请明确指定。

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

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

val box = Box(1) // T is inferred to be Int
于 2018-04-25T10:12:34.513 回答