дженерики между Java и Kotlin! Помоги мне? - PullRequest
0 голосов
/ 03 мая 2018

Вот мой код

[Котлин]

internal abstract class Parent<out T, in V> constructor(
    tList: List<T>,
    vList: List<V>
) {

    abstract fun get(): List<T>
    abstract fun set(v: List<V>)

}

[Java] - наследует класс kotlin Parent.

final class Child extends Parent<Number, String> {

    public Child(
            @NotNull List<? extends Number> tList, 
            @NotNull List<? extends String> vList) {
        super(tList, vList);
    }

   @NotNull @Override
    public List<Number> get() {
        return null;
    }

    @Override
    public void set(@NotNull List<? extends String> v) {}

}

Родительский класс имеет Обобщения, называемые T (out), V (in),

так я думаю ..

конструктор класса Child должен быть ..

public Child(
        @NotNull List<? extends Number> tList, 
        @NotNull List<? super String> vList) {
    super(tList, vList);
}

т.е. второй аргумент vList должен быть

List<? super String>

потому что V Generic родителя "в", но это ..

List<? extends String>

кто-нибудь может это объяснить? помоги мне!

[Изменено] ...

public Child(
        @NotNull List<Number> tList, 
        @NotNull List<String> vList) {
    super(tList, vList);
}

Это возможно .. код в моем вопросе просто сгенерированный код из IDE ..

1 Ответ

0 голосов
/ 23 мая 2018

В Kotlin интерфейс List является неизменяемым, что означает, что он доступен только для чтения.

Вот его подпись:

public interface List<out E> : Collection<E>

Итак, ваш конструктор на самом деле выглядит так:

internal abstract class Parent<out T, in V> constructor(
    tList: List<out T>,
    vList: List<out V>
)

Если вы хотите поместить значения в vList (что вы указали, используя in), вы должны использовать интерфейс MutableList:

internal abstract class Parent<T, V> constructor(
    tList: List<T>,
    vList: MutableList<in V>
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...