如果我有以下的,它的工作原理(即数获得分配1000)java.lang.Integer中不能转换为java.lang.Long中在科特林(当初始值为null)
fun main(args: Array<String>) {
var number: Long ? = null // or number = 0
val simpleObject = SimpleClass()
number = 1000
println("Hi + $number")
}
如果我有以下的,它的工作原理(即数获得分配1000)
import java.util.*
fun main(args: Array<String>) {
var number: Long = 0
val simpleObject = SimpleClass()
number = simpleObject.getValue<Long>()
println("Hi + $number")
}
class SimpleClass() {
fun <T>getValue(): T {
return 1000 as T
}
}
但是,如果我有下面的,它失败
import java.util.*
fun main(args: Array<String>) {
var number: Long? = null
val simpleObject = SimpleClass()
number = simpleObject.getValue<Long>()
println("Hi + $number")
}
class SimpleClass() {
fun <T>getValue(): T {
return 1000 as T
}
}
报告的错误是在number = simpleObject.getValue<Long>()
线
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
为什么当我初始化var number: Long ? = null
和var number: Long = 0
有不同的结果呢?我有什么不对吗?
使用下面的修订
一种解决方法,结果是好的。但是使用额外的临时变量。
import java.util.*
fun main(args: Array<String>) {
var number: Long? = null
val simpleObject = SimpleClass()
val temp = simpleObject.getValue<Long>()
number = temp
println("Hi + $number")
}
class SimpleClass() {
fun <T>getValue(): T {
return 1000 as T
}
}
感谢提供产生的2个DEX代码背后的细节出色的技术原因。这很好解释。我认为Kotlin语言应该改善它可以直接转换为java/lang/Number而不是java/lang/Long的地方。所以现在简而言之,他们是不同的。 Upvote你的答案并打勾接受它。谢谢!! – Elye
你总是欢迎:) – soon
你认为这是预期的行为? – voddan