【问题标题】:object instatiation for java class returning SELF is not working kotlinjava类返回SELF的对象实例化不起作用kotlin
【发布时间】:2018-10-05 12:46:00
【问题描述】:
我有一个java类
public class CouchbaseContainer<SELF extends CouchbaseContainer<SELF>>
当我尝试在 kotlin 中为此创建对象时
val couchbase = CouchbaseContainer()
Kotlin 抛出错误
类型推断失败:没有足够的信息来推断参数 SELF
在构造函数 CouchbaseContainer 中!>
()。请明确说明
但我可以在 Java 中创建这个对象,如下所示:
CouchbaseContainer couchbase = new CouchbaseContainer();
【问题讨论】:
标签:
generics
kotlin
couchbase
type-inference
testcontainers
【解决方案1】:
试试这个:
class KCouchbaseContainer : CouchbaseContainer<KCouchbaseContainer>()
val couchbase = KCouchbaseContainer()
【解决方案2】:
问题是在 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