Проблемы с дженериками в Котлине - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь создать общий класс, но не могу заставить "funTestInterface" перестать спрашивать "ничего", кто-нибудь знает, почему это может произойти?Спасибо!

package main

interface ITest<S> {
    fun funTestInterface(param: S): S
}

class GeneralClass {
    fun otro(param: ITest<*>, secondParam: Any) {
        param.funTestInterface(secondParam)
    }
}

class ImplementedClass : ITest<String> {

    override fun funTestInterface(param: String): String {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}

fun main() {
    val a = GeneralClass()

    a.otro(ImplementedClass(), "")
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы хотите использовать проекции звезд здесь.Вы можете использовать param с проекцией в виде звезды, чтобы только безопасно считывать значения из нее (вы можете использовать ее как тип вывода), но в вашем случае звезда рассматривается как тип ввода.Звезда в компиляции рассматривается как тип Nothing, который не эквивалентен Any.Сказав это, вы не можете использовать Any в качестве ввода для funTestInterface.

. Вы можете просто разрешить это, обобщив функцию GeneralClass.otro():

fun <T> otro(param: ITest<T>, secondParam: T) {
    param.funTestInterface(secondParam)
}
0 голосов
/ 03 октября 2018

GeneralClass должен быть

class GeneralClass {
fun otro(param: ITest<String>, secondParam: Any) {
    param.funTestInterface(secondParam as String)
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...