如何在kotlin中获取泛型类属性?

Friends! 不知道大佬们在用kotlin时遇到jvm的类型擦除问题的时候是怎么解决的,来问问有没有更漂亮的解决方案。 下面是一些外围代码 。 /…
关注者
6
被浏览
3,174

2 个回答

假设有一个泛型类:

class Banner<T, VH : RecyclerView.ViewHolder, BA : BannerAdapter<T, VH>> :
    FrameLayout, BannerLifecycleObserver


如果我们按如下方式引用它:

class ScrollSpeedManger(
    banner: Banner,
    linearLayoutManager: LinearLayoutManager
) : LinearLayoutManager(banner.getContext(), linearLayoutManager.orientation, false)

按照Java的思路,这并没有什么问题,但是Kotlin将报错:

3 type arguments expected for class Banner<T, VH : RecyclerView.ViewHolder, BA : BannerAdapter<T, VH>>

这里体现出Kotlin与Java的不同来:

在Kotlin中,要引用一个泛型类,必须指定它的泛型类型。

但是,如果我们在定义class ScrollSpeedManger时,并不知道Banner的泛型,那要怎么办呢?

答案非常简单:如果不确定泛型的真实类型,就用*代替,如下所示即可:

class ScrollSpeedManger(
    banner: Banner<*, *, *>,
    linearLayoutManager: LinearLayoutManager
) : LinearLayoutManager(banner.getContext(), linearLayoutManager.orientation, false)

题目:说下Kotlin语言泛型的形变是什么?

这道题想考察什么?

  1. 是否了解Kotlin语言泛型的形变是什么与真实场景使用,是否熟悉Kotlin语言泛型的形变是什么本质?

考察的知识点

  1. Kotlin语言泛型的形变是什么的概念在项目中使用与基本知识

考生应该如何回答

1.你工作这么些年,对于Kotlin语言泛型的形变是什么,有了解么?

答:

形变一共分为三个区域:不变,协变,逆变

不变

不变指的是:这个泛型,可以是生产者,也可以是消费者,此泛型没有任何泛型继承相关的概念,可以理解是完全独立出来的泛型

例如:下面案例中,此泛型既可以是生产者,也可以是消费者

// 不变
class StudentSetGets<IO> {
    private var item : IO? = null
    // 消费者
    fun set(value : IO) {
        println("你传递进来的内容是:$value")
        item = value
    // 生产者
    fun get() = item