我有一个java类
public class CouchbaseContainer<SELF extends CouchbaseContainer<SELF>>
当我尝试在kotlin
中为此创建对象时val couchbase = CouchbaseContainer()
Kotlin投掷错误
类型推断失败:没有足够的信息来推断参数SELF 在构造函数CouchbaseContainer中!&gt; ()。请明确说明
但是我能够用Java创建这个对象,如下所示:
CouchbaseContainer couchbase = new CouchbaseContainer();
答案 0 :(得分:2)
尝试一下:
class KCouchbaseContainer : CouchbaseContainer<KCouchbaseContainer>()
val couchbase = KCouchbaseContainer()
答案 1 :(得分:1)
问题是在Java字节码中没有泛型的概念(称为type erasure),因此类型SELF
不会出现在字节码中。这就是为什么在Java中你可以创建一个实例而不指定SELF
的实际值。
但是,在Kotlin中,我猜编译器认为CouchbaseContainer
是通用的,它要求您提供实际的SELF
值。实际上,错误消息类似于:
类型推断失败:没有足够的信息来推断
中的参数T.constructor Foo<T : Any!> ( )
请明确说明。
另外,请注意,如果可以推断类型(例如,因为您通过构造函数传递它),则不需要提供它,如下例所示(取自documentation) :
class Box<T>(t: T) {
var value = t
}
val box = Box(1) // T is inferred to be Int