Kotlin的泛型

时间:2021-7-5 作者:qvyue

kotlin的泛型只是给java的泛型的概念换了一种写法,所以对java泛型不熟悉的可以看我的上一篇文章java的泛型

泛型类、泛型接口

通过泛型类OrderedPair去实现泛型接口:

interface Pair {
  var key: K

  var value: V

  fun generate(): K
}

class OrderedPair(override var key: K, override var value: V) : Pair {

  override fun generate(): K {
      return key
  }

}

OrderedPair实例类的写法:

val p1: OrderedPair = OrderedPair("Event", 8)
val p2 = OrderedPair("hello", "world")

泛型方法

如果在类和接口中没有定义想要的泛型参数,又想在方法中使用泛型参数,则只能如下面中定义泛型方法:

class Util {
  companion object {
      fun  compare(p1: Pair, p2: Pair): Boolean {
          return p1.key == p2.key
                  && p1.value == p2.value
      }
  }

}


val p1: OrderedPair = OrderedPair("Event", 8)
val p2 = OrderedPair("hello", 10)
var isEquals = Util.compare(p1, p2)

限定类型

如果我们想限定类型参数T,只能是Number类型及其子类,改怎么限定呢?在java中我们可以使用extend,在kotlin中使用

class Box {
  var element: E? = null

  fun  inject(u: U) {
      print("u= ${u}")
  }
}

var box: Box = Box()
box.inject(10)

out上限通配符

在java中? extends叫上限通配符,而在kotlin中out叫上限通配符,可以确定参数是其类型及其子类型。上限通配符是支持协变的,则可以使没有父子关系的类完成多态的赋值。以下是用List确定T参数是一个Number的上限通配符,完成元素的增加:

fun sumOfList(list: List): Double {
      var sum: Double = 0.0
      for (number in list) {
          sum += number.toDouble()
      }
      return sum
  }


val list = Arrays.asList(1, 2, 3)
val sum = sumOfList(list)

out上限通配符是支持协变的即:

val box3: Box = Box()
val box4: Box = box3 

kolint在out上的扩展,在java中通配符?:extends只能在确定类型参数的时候使用,并不可以在泛型类、泛型接口中使用,但out就可以直接在类、接口中直接声明该泛型为上下限:

interface List : Collection {
}

下限通配符

在java? spuer即叫下限通配符,在kotlinin即叫下限通配符,可以确定参数的类型及其父类型。下限通配符则支持逆变,跟上边的协变是一个道理:

fun printBox(box: Box) {
      println("number= ${box.element}")
  }

val box5: Box = Box()
box5.element = 10
printBox(box5)

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。