Общий список Java / Kotlin несовместимых типов с подстановочными знаками - PullRequest
0 голосов
/ 03 мая 2018

У меня есть абстрактный класс Java с конкретным методом, который вызывает метод в подклассах:

abstract class JavaSuperclass<T> {
    T doSomething() {
        ...
        return doSomethingInSubclass();
    }

    abstract T doSomethingInSubclass();
}

У меня есть подкласс Java с его универсальным типом, установленным в List:

class JavaSubclass extends JavaSuperclass<List<WhateverJava>> {
    List<WhateverJava> doSomethingInSubclass() {...}
}

И у меня есть подкласс Kotlin:

class KotlinSubclass : JavaSuperclass<List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}

(WhateverJava - это класс Java, WhateverKotlin - это класс данных Kotlin.)

Затем в классе Java я использую оба подкласса.

List<WhateverJava> listFromJava = javaSubclass.doSomething();
List<WhateverKotlin> listFromKotlin = kotlinSubclass.doSomething();

Строка, которая вызывает подкласс Java, компилируется нормально, но та, которая вызывает подкласс Kotlin, выдает эту ошибку:

error: incompatible types: List<capture<? extends WhateverKotlin>> cannot be converted to List<WhateverKotlin>

1 Ответ

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

Списки в Котлине ковариантны. Таким образом, класс Kotlin переводится на Java как:

class KotlinSubclass extends JavaSuperclass<List<? extends WhateverKotlin>>

Добавление аннотации @JvmSuppressWildcards к классу Kotlin исправляет это.

class KotlinSubclass : JavaSuperclass<@JvmSuppressWildcards List<WhateverKotlin>> {
    override fun doSomethingInSubclass(): List<WhateverKotlin> {...}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...