java - ClassAny 类之间有什么区别(信用 : Any) and class UserAdmin<T>(credit:T) in Kotlin?

标签 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")
}

程序的输出是:

带有泛型的类:String 具有泛型的类:1 任何类(class):1 任何类:字符串

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

提前致谢。

最佳答案

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

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 类型,该类型基本上可以是 any 类型并且可能会在运行时失败,而泛型已经在编译时为您提供了类型安全性。

advantages of generics :

  • 消除类型转换
  • 在编译时进行更强的类型检查
  • 使程序员能够实现通用算法

关于java - ClassAny 类之间有什么区别(信用 : Any) and class UserAdmin<T>(credit:T) in Kotlin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49168027/

相关文章:

java - 在哪里以及如何存储文本文件以供读/写

vb.net - 通用列表复制引用而不是创建复制列表

java - 获取垃圾输出 Java

java - 如何在运行时更改java中动态数组的值?

java - Autowiring 和计时器任务的问题

c# - 将一些 C# 通用代码重写为 F#

java - Mockito:使用泛型列出匹配器

android - 将 @ActivityScoped 对象注入(inject)到 Fragment 中

kotlin - 我如何在 Android Jetpack Compose 中的 Canvas 上绘制单侧加厚描边?

kotlin - 如何从调用对象获取IP地址