【问题标题】:Typecasting from Double to Float results in ClassCastException从 Double 类型转换为 Float 导致 ClassCastException
【发布时间】:2020-04-13 06:46:26
【问题描述】:

代码:-

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() 工作得很好但num as Float 给出错误?这两种不同的语法不应该做同样的事情吗?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

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

    .toXxx() 方法convert 将值从一种类型转换为另一种类型。这可以是远相关的类型(例如ListString)或密切相关的类型(例如IntFloat),但在所有情况下它们都是不同的类型,并且具有不同的值.

    然而,

    as 是一个演员表强制转换不会将值转换为所需的类型;强制转换向编译器保证该值已经属于所需的类型。如果不是,你会得到一个错误,正如你所发现的那样。

    诸如 C 和 Java 之类的语言在数值类型方面相当松懈,并且在许多情况下会自动在它们之间进行转换(“数值提升”),这可能就是您混淆这两者的原因。这可能很方便;但它也可能导致微妙的错误。所以 Kotlin 做的少得多,带来了额外的安全性(这是该语言的主题之一)。

    (这种混淆似乎很常见;参见例如仅 4 天前的 this question。)

    【讨论】:

    • 如果在编译时就已经知道它是什么类型的变量,那么as 转换有什么用呢?
    • @ParagKadam 有时你知道一些编译器不知道的东西。 (虽然不像人们想象的那么频繁,IME...)在那些情况下,你可以确定一个演员不会失败,那么它就很有用。 (不过,Kotlin 的安全转换 as? 运算符可以更轻松地处理“不可能”,通常是更好的选择。)
    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多