返回SELF的java类的对象instati不起作用kotlin

时间:2018-04-25 06:36:32

标签: generics kotlin couchbase type-inference testcontainers

我有一个java类

public class CouchbaseContainer<SELF extends CouchbaseContainer<SELF>>

当我尝试在kotlin

中为此创建对象时
val couchbase = CouchbaseContainer()

Kotlin投掷错误

  

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

但是我能够用Java创建这个对象,如下所示:

CouchbaseContainer couchbase = new CouchbaseContainer();

2 个答案:

答案 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