代码之家  ›  专栏  ›  技术社区  ›  João Menighin

Out projected type…禁止使用FooTable中定义的“公开娱乐”

  •  0
  • João Menighin  · 技术社区  · 6 年前

    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 其中我需要获取另一个表的引用并获取其数据。我想我已经可以传递数据了,但我很好奇为什么现在不起作用。。。

    this question 如果我能改变 abstract val table: FooTable<M, out IDto> abstract val table: FooTable<M, Any> 没关系。。。但是,据我所知,我不能,因为 可行走 IDto

    1 回复  |  直到 6 年前
        1
  •  0
  •   Yoni Gibbs    6 年前

    问题是在你的 testTable masterTable 的第一个泛型类型限制( IModel )是 out . 如果将声明更改为此,它将编译:

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

    (或者,请两者都不指定。) in 也没有

    这是可以解释的 here (不过你需要花点时间才能清醒过来)。我认为您现有的代码(带有 伊莫代尔 出来 )声明 主表 伊莫代尔 s、 但是没有关于它能带来什么的规定。因此,错误(至少在IntelliJ中)为:

    类型不匹配。要求的 List<Nothing> . 建立 List<IModel>

    主表 getTableData 方法