Java class Any(学分:Any)和class UserAdmin之间有什么区别<;T>;(信用:T)在科特林?

Java class Any(学分:Any)和class UserAdmin之间有什么区别<;T>;(信用:T)在科特林?,java,generics,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<Strin

我在学习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")
}
class用户管理员(学分:T){
初始化{
println(“具有泛型的类:“+学分”)
}
}
类UserAdminAny(学分:Any){
初始化{
println(“任何类别:$credit”)
}
}
趣味主线(args:Array){
var user=UserAdmin(“字符串”)
var user2=UserAdmin(1)
var userAny=UserAdminAny(1)
var userAny2=UserAdminAny(“字符串”)
}
程序的输出为:

使用泛型初始化:String 带有泛型的类:1 任何类别: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!
类用户管理员(val学分:T)
类UserAdminAny(val信用:Any)
val user=UserAdmin(“字符串”)
println(用户.信用.长度)
val userAny2=UserAdminAny(“字符串”)
println(userAny2.credit.length)//未编译,您需要在编译之前将任何字符串强制转换为字符串!
作为客户机,您希望属性是
String
,而不必强制转换
Any
类型,该类型基本上可以是Any类型,并且可能在运行时失败,而泛型已经在编译时为您提供了类型安全性

主要问题:

  • 消除型铸造
  • 编译时更强的类型检查
  • 使程序员能够实现通用算法

它与java基本相同(尽管
Any
的工作原理与
Object
略有不同),请参见例如:谢谢!!有道理!!但不知道里面还有什么!事实上不,你到底在想什么