当前位置:   article > 正文

kotlin 中的数据类型、泛型、枚举_kotlin data class 泛型

kotlin data class 泛型

Kotlin 中可以创建包含数据的类,使用的关键字为 data,比如说 data class Student(val name: String, val age: Int),编译器会自动重写 equals() 、 hashCode() 、toString() 等方法

  1. fun test(){
  2.     val u = Student("tom", 15)
  3.     val u1 = Student("tom", 15)
  4.     println(u == u1)  // 比较equals()
  5.     println(u === u1) // 比较地址值
  6.     println(u.hashCode())
  7.     println(u.toString())
  8.     println(u.component1() + "    " + u.component2())  // Student 中的属性,按照顺序排列
  9.     println(u.copy(age = 45))  // 替换 age 的值
  10. }

打印的结果为

  1. true
  2. false
  3. 3565821
  4. Student(name=tom, age=15)
  5. tom    15
  6. Student(name=tom, age=45)

Kotlin 中还有个密封类的概念,在我的理解中,它更像是一个枚举的扩展,后面会提到枚举;接下来先看看泛型,Kotlin 中的泛型与 Java 中的类似,用法也差不多,举个容器泛型,看看例子

  1. class ABox<T>(t : T) {
  2.     val value : T = t
  3. }
  4. fun test(){
  5.     val i = ABox<Int>(12)
  6.     val j = ABox<String>("Tom")
  7.     val k = ABox(true)
  8.     println("i: ${i.value}   j: ${j.value}   k: ${k.value}")
  9. }

这个例子中,i 和 j 指定了泛型的类型,而 k 则没有,这里用的是类型的推导,可以这么写;运行 test(),打印的值为

i: 12   j: Tom   k: true

我们知道,泛型更多的是用在方法中,比如说方法中有个形参,我们想通过泛型来扩展或保证安全,看例子

  1. open class AAA
  2. open class AB : AAA(){
  3.     open fun study(){
  4.         println("AB")
  5.     }
  6. }
  7. class AC : AB(){
  8.     override fun study() {
  9.         println("AC")
  10.     }
  11. }
  12. fun testPrint(bean : AB){
  13.     bean.study()
  14. }
  15. fun <T : AB>testPrint1(b : T){
  16.     b.study()
  17. }
  18. fun test(){
  19.     val i = AB()
  20.     val j = AC()
  21.     testPrint(i)
  22.     testPrint(j)
  23.     println()
  24.     testPrint1(i)
  25.     testPrint1(j)
  26. }

testPrint(bean : AB) 是常规写法,testPrint1(b : T) 是添加了泛型的写法,调用 test() 方法,打印的数值为

  1. AB
  2. AC
  3. AB
  4. AC

泛型可以这样使用,还可以通过通配符的用法更加精确的控制方法,在 Java 中会在泛型中使用 extend 和 super 来表示生产者和消费者,而在 Kotlin 中,则是以 out 和 in 来表示,并且由于 in 表示消费者,所以不能使用 val 来修饰,见下面

  1. class BA<out AB>(val ab : AB){
  2.     fun foo(): AB {
  3.         return ab
  4.     }
  5. }
  6. class BC<in AB>( ab : AB){
  7.     fun foo() {
  8.     }
  9. }

关于泛型的讲解,在之前的文章中,effective java 注解中,有过详细的讲解,可以对比思考 : https://blog.csdn.net/Deaht_Huimie/article/details/82872858 ,Kotlin 中泛型还有个星号的用法,意思是可以添加任何类型的对象

  1. class ABox<T>(val t: T, val t2 : T, val t3 : T)
  2. class Bean(var name : String)
  3. fun test(){
  4.     val a: ABox<*> = ABox(12, "Tom", Bean("Jack"))
  5.     val a1: ABox<Any?> = ABox(12, "Tom", Bean("Jack"))
  6.     val bean = a.t3
  7.     val bean1 = a1.t3
  8.     println("$bean    $bean1")
  9.     val list:ArrayList<*> = arrayListOf("Tom",1,1.2f,Bean("Jack"))
  10.     for (item in list){
  11.         println(item)
  12.     }
  13. }

运行,调用 test() 方法,打印结果为

  1. com.example.cn.desigin.test.Bean@3af49f1c    com.example.cn.desigin.test.Bean@19469ea2
  2. Tom
  3. 1
  4. 1.2
  5. com.example.cn.desigin.test.Bean@448139f0

在这里,val a: ABox<*> 和 val a1: ABox<Any?> 的意思是一样的,都是指在容器 ABox 中可以添加任意类型的对象。

Kotlin 中枚举和 Java 中枚举用法和写法都极为接近,

  1. enum class FRUIT{
  2.     APPLE,ORANGE,BANANA,PEAR,WATERMELON
  3. }
  4. fun test(){
  5.     var fruit:FRUIT=FRUIT.BANANA
  6.     println(FRUIT.values().size)
  7.     println(FRUIT.valueOf("ORANGE"))
  8.     println(fruit.name)
  9.     println(fruit.ordinal)
  10. }

分别打印了枚举的总个数及 BANANA 的名字和序列号,打印的值为

  1. 5
  2. ORANGE
  3. BANANA
  4. 2

枚举中也可以定义抽象方法,然后让每个枚举对象实现该抽象方法,这里与java中的一模一样。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/259925?site
推荐阅读
相关标签
  

闽ICP备14008679号