объект объекта для Java-класса, возвращающий SELF не работает kotlin - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть класс Java

public class CouchbaseContainer<SELF extends CouchbaseContainer<SELF>>

, когда я пытаюсь создать объект для этого в kotlin

val couchbase = CouchbaseContainer()

Kotlin выдает ошибку

ТипОшибка вывода: недостаточно информации для вывода параметра SELF в конструкторе CouchbaseContainer!> ().Пожалуйста, укажите это explicity

, но я могу создать этот объект на Java, как показано ниже:

CouchbaseContainer couchbase = new CouchbaseContainer();

Ответы [ 2 ]

0 голосов
/ 21 августа 2018

Попробуйте это:

class KCouchbaseContainer : CouchbaseContainer<KCouchbaseContainer>()
val couchbase = KCouchbaseContainer()
0 голосов
/ 25 апреля 2018

Проблема заключается в том, что в байт-коде 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
...