Kotlin中ClassAny(credit:Any)和class UserAdmin <t>(credit:T)之间有什么区别?

时间:2018-03-08 07:54:01

标签: java generics kotlin

我在学习Kotlin语言的同时编写了以下代码。

class UserAdmin<T>(credit: T) {
    init {
        println("Class with generics: " + credit)
    }
}

class UserAdminAny(credit: Any) {
    init {
        println("Any class: $credit")
    }
}

fun main(args: Array<String>) {

    var user = UserAdmin<String>("String")
    var user2 = UserAdmin<Int>(1)

    var userAny = UserAdminAny(1)
    var userAny2 = UserAdminAny("String")
}

该计划的输出是:

带有泛型的类:字符串 具有泛型的类:1 任何课程:1 任何类:String

我想知道Kotlin中“Any”关键字和泛型之间有什么区别,以及何时何地使用它们。 这两个都给出了相同的答案。

提前致谢。

1 个答案:

答案 0 :(得分:2)

从客户的角度来看,主要是关于编译时类型安全。拿这个:

class UserAdmin<T>(val credit: T)
class UserAdminAny(val credit: Any)

val user = UserAdmin("String")
println(user.credit.length)
val userAny2 = UserAdminAny("String")
println(userAny2.credit.length) //does not compile, you'd need to cast Any to String before!

作为客户端,您希望该属性为String,而不是必须强制转换Any类型,这可能基本上是任何的事情,并且可能在运行时失败而泛型已经在编译时为您提供了类型安全性。

advantages of generics

  • 消除类型转换
  • 在编译时更强类型签入 g
  • 使程序员能够实施通用算法