【问题标题】:object instatiation for java class returning SELF is not working kotlinjava类返回S​​ELF的对象实例化不起作用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
      

      【讨论】:

        猜你喜欢
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多