Запроектированный тип ... запрещает использование 'общедоступного веселья .... определенного в FooTable - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий класс:

abstract class FooTable<M, D> where M : IModel, D : IDto {

    ///...

    fun getTableData(models: ArrayList<M>): ArrayList<D> {
        // ...
    }

}

И у меня есть другой класс, использующий его как:

abstract class FooPage<M, F> where M : IModel, F : IFilter {
    abstract val table: FooTable<M, out IDto>

Затем где-то в моем коде я пытаюсь сделать:

page.table.getTableData(arrayListOf(m1, m2)).first()

И это дает мне:

Запроектированный тип FooTable<out IModel, out IDto> запрещает использование public final fun getTableData(models: kotlin.collections.ArrayList<M> /* = java.util.ArrayList<M> */): kotlin.collections.ArrayList<D> /* = java.util.ArrayList<D> */, определенного в com.menighin.example.models.FooTable

Вот скрипка с проблемой: https://pl.kotl.in/ryirJJH9m

Код:

interface IModel

interface IDto

interface IFilter

class Model : IModel

class Dto : IDto

class Filter : IFilter

class FooTable<M, D> where M : IModel, D : IDto {
    fun getTableData(models: List<M>): ArrayList<D> {
        return ArrayList()
    }

    fun testPage(masterModel: IModel, thisPage: FooPage<out IModel, out IFilter>) {
        thisPage.table.getTableData(arrayListOf(masterModel)) // Error here
    }

    fun testTable(masterModel: IModel, masterTable: FooTable<out IModel, out IDto>) {
        masterTable.getTableData(arrayListOf(masterModel)) // And error here
    }
}

class FooPage<M, F> where M : IModel, F : IFilter {
    val table: FooTable<M, out IDto> = FooTable()
}


fun main() {

    val page = FooPage<Model, Filter>()

    val a = page.table.getTableData(arrayListOf())

    println("Hello, world!!!")
}

В моей FooTable есть функция, в которой мне нужно получить ссылку на другую таблицуи получить его данные.Я думаю, я уже мог передать данные, но мне интересно, почему это не работает сейчас ...

Я понимаю из этот вопрос , что если бы я мог изменить abstract val table: FooTable<M, out IDto> наabstract val table: FooTable<M, Any> это было бы хорошо ... Но, насколько я знаю, я не могу, потому что определение FooTable строго по второму параметру, реализующему IDto.

Как я могу исправитьэто?

1 Ответ

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

Проблема в том, что в вашей функции testTable вы указываете, что первое ограничение универсального типа masterTable (IModel) равно out.Если вы измените объявление на это, оно скомпилирует:

fun testTable(masterModel: IModel, masterTable: FooTable<in IModel, out IDto>)

(В качестве альтернативы не указывайте ни in, ни out.)

Это объяснено здесь (хотя нужно немного подумать).Я думаю, что ваш существующий код (с общим ограничением типа IModel out) утверждает, что аргумент masterTable производит IModel s, но нет никаких правил относительно того, что он принимает. Следовательно, ошибка (по крайней мере, вIntelliJ):

Несоответствие типов.Требуется List<Nothing>.Найдено List<IModel>.

Поскольку компилятор не знает, что может принять masterTable, он не может быть уверен, что он может принять IModel, который вы пытаетесь передать в getTableData метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...