Kotlin 从Double到Float的类型转换导致ClassCastException

Kotlin 从Double到Float的类型转换导致ClassCastException,kotlin,Kotlin,代码:- val num = 12.12 val num2: Float = num.toFloat() // Works val num3: Float = num as Float // Exception 例外情况:- 线程“main”java.lang.ClassCastException中的异常:无法将类java.lang.Double转换为类java.lang.Float(java.lang.Double和java.lang.Float位于加载程序“引导”的模块java.base中

代码:-

val num = 12.12
val num2: Float = num.toFloat() // Works
val num3: Float = num as Float // Exception
例外情况:-

线程“main”java.lang.ClassCastException中的异常:无法将类java.lang.Double转换为类java.lang.Float(java.lang.Double和java.lang.Float位于加载程序“引导”的模块java.base中)


有人能告诉我为什么
num.toFloat()
工作正常,但是
numas Float
给出了一个错误吗?这两种不同的语法不是应该做相同的事情吗?

不,它们做的事情不同

.toXxx()
方法将一个值从一种类型转换为另一种类型。这可以是远亲类型(例如
列表
字符串
),也可以是近亲类型(例如
Int
浮点
),但在所有情况下,它们都是不同的类型,并且具有不同的值

as
是强制转换。强制转换不会将值转换为所需类型;强制转换向编译器保证该值已经是所需的类型。如果不是,就会发现一个错误

像C和Java这样的语言对数字类型相当宽松,在许多情况下会自动在它们之间转换(“数字升级”),这可能就是为什么你会混淆两者的原因;但是它也会导致一些微妙的错误,所以Kotlin做的要少得多,带来了额外的安全性(这是该语言的主题之一)


(这种混淆似乎很常见;例如,从4天前开始。)

不,他们没有做同样的事情

.toXxx()
方法将一个值从一种类型转换为另一种类型。这可以是远亲类型(例如
列表
字符串
),也可以是近亲类型(例如
Int
浮点
),但在所有情况下,它们都是不同的类型,并且具有不同的值

as
是强制转换。强制转换不会将值转换为所需类型;强制转换向编译器保证该值已经是所需的类型。如果不是,就会发现一个错误

像C和Java这样的语言对数字类型相当宽松,在许多情况下会自动在它们之间转换(“数字升级”),这可能就是为什么你会混淆两者的原因;但是它也会导致一些微妙的错误,所以Kotlin做的要少得多,带来了额外的安全性(这是该语言的主题之一)


(这种混淆似乎很常见;例如,从4天前开始。)

如果在编译时已经知道它是什么类型的变量,那么
作为
强制转换有什么用?@parakadam有时你知道编译器不知道的事情。(虽然不像人们想象的那么频繁,IME…)在那些情况下,如果你能确定演员阵容不会失败,那么它可能会很有用。(然而,Kotlin的safe cast
as?
运算符使“不可能”更容易处理,通常是更好的选择。)如果在编译时已经知道它是什么类型的变量,那么
as
cast还有什么用?@ParagKadam有时你知道编译器不知道的事情。(虽然不像人们想象的那么频繁,IME…)在那些情况下,如果你能确定演员阵容不会失败,那么它可能会很有用。(然而,Kotlin的safe cast
as?
操作符使“不可能”更容易处理,通常是更好的选择。)