Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Kotlin中,在泛型函数中强制转换或使用多个约束边界的替代方法是什么?_Android_Kotlin_Generics - Fatal编程技术网

Android 在Kotlin中,在泛型函数中强制转换或使用多个约束边界的替代方法是什么?

Android 在Kotlin中,在泛型函数中强制转换或使用多个约束边界的替代方法是什么?,android,kotlin,generics,Android,Kotlin,Generics,我有三个数据类,我想创建一个通用函数来映射它们: data class Visits( val present: List<Present>, val past: List<Past> ) data class Present{ val field1: String, val field2: String } data class Past{ val field1: String, val field2: String

我有三个数据类,我想创建一个通用函数来映射它们:

data class Visits(
    val present: List<Present>,
    val past: List<Past>
)

data class Present{
    val field1: String,
    val field2: String
}

data class Past{
    val field1: String,
    val field2: String
}
数据类访问(
出席:名单,
val过去:列表
)
存在数据类{
val字段1:字符串,
val字段2:字符串
}
数据类过去{
val字段1:字符串,
val字段2:字符串
}
我尝试过的泛型函数如下

    private fun doSomething(visits: Visits, position: Int) {
        when (position) {
            0 -> setItems(visits.present)
            1 -> setItems(visits.past)
            ...
        }
    }

    private fun <T> setItems(visits: List<T>): ArrayList<Something> {
        val items: ArrayList<Something> = arrayListOf()
        
        visits.forEach { i ->
            items.add(
                Something(
                    i.field1,
                    i.field2
                )
            )
        }
        return items
    }
    inline fun <reified T> doSomethingWithType(list: List<T>) {
     // do something with visits list, which can be List<Present> or List<Past>
    }
private fun doSomething(访问:访问,位置:Int){
何时(职位){
0->setItems(visions.present)
1->设置项目(访问次数、过去)
...
}
}
私人娱乐设置项(访问:列表):ArrayList{
val项:ArrayList=arrayListOf()
visions.forEach{i->
items.add(
某物(
i、 字段1,
i、 字段2
)
)
}
退货项目
}
总的来说,这就是代码,我试着使用

    private fun doSomething(visits: Visits, position: Int) {
        when (position) {
            0 -> setItems(visits.present)
            1 -> setItems(visits.past)
            ...
        }
    }

    private fun <T> setItems(visits: List<T>): ArrayList<Something> {
        val items: ArrayList<Something> = arrayListOf()
        
        visits.forEach { i ->
            items.add(
                Something(
                    i.field1,
                    i.field2
                )
            )
        }
        return items
    }
    inline fun <reified T> doSomethingWithType(list: List<T>) {
     // do something with visits list, which can be List<Present> or List<Past>
    }
inline fun doSomethingWithType(列表:列表){
//使用访问列表做一些事情,可以是列表或列表
}

我希望避免setItems函数的代码重复,例如setItemsPresent和setItemsPast。

我建议用接口解决这个问题

interface Item {
    val field1: String
    val field2: String
}

data class Present(
    override val field1: String,
    override val field2: String
) : Item

data class Past(
    override val field1: String,
    override val field2: String
) : Item
然后,您的子片段可以获取一个类型为
list
的列表,无论它们是当前的还是过去的数据对象

因此,泛型映射函数没有太多意义,但是您知道,您需要的是通过泛型约束获得有关泛型的更多信息

data class Something(
    val field1: String,
    val field2: String
)

fun <T : Item> mapToSomething(visits: List<T>): List<Something> {
    return visits.map { Something(it.field1, it.field2) }
}
数据类(
val字段1:字符串,
val字段2:字符串
)
趣味地图内容(访问:列表):列表{
回访.map{Something(it.field1,it.field2)}
}

我不太明白你想做什么。你想把现在和过去映射到什么?什么东西?您可能想利用标准的kotlin list.map{}扩展函数,可能会使问题变得更简单。场景是,访问是一个api响应对象,ideia是将列表中的那些值(现在、过去)映射到不同的选项卡。我所说的是一个用于数据绑定的数据类。因此,更具体地说,有一个带有TabLayout和ViewPager2的父片段。我打算为tabitems重用一个片段,因此我使用一个viewmodel并将位置传递给子片段,一个片段将包含列表项,另一个片段包含列表项。我知道还有其他的方法,但我正在尝试使用泛型并制作一种可重用的组件。