当前位置: 首页 > 知识库问答 >
问题:

Kotlin数据类型是基于原始的还是非原始的Java数据类型构建的?

常自强
2023-03-14

我是科特林的新手,我在玩数据类型。我取了一个<code>Int</code>类型,然后尝试将其转换为<code>Double</code>,将<code>num表示为Double>/code,这是一个在java中有效的调用(非语法上,但你明白了)。然而,这失败了,表示Int不能强制转换为Double。我假设这是因为它是基于Integer类而不是原始int数据类型构建的。我说得对吗?什么是最有效的价值观传递方式?有一个<code>。toDouble()函数,但这看起来效率低下且笨拙。

共有2个答案

龚承嗣
2023-03-14

这是因为Kotlin不像Java那样扩大数字。

Kotlin 中没有数字的隐式加宽转换。例如,你可以用Java编写一些东西,如下所示:

int a = 1;
double b = a;

然而,你不能用科特林写东西。例如:

val a:Int = 1  
//             v--- can't be widening
val b:Double = a

这是因为Kotlin中的所有内容都是对象,没有基本类型,所以应该将< code>Int显式转换为< code>Double,例如:

val a:Int = 1  
//               v--- convert it explicitly by `toDouble()` method
val b:Double = a.toDouble()
龙兴贤
2023-03-14

我接受了一个< code>Int类型,然后通过说< code>num as Double试图将其转换为< code>Double

不,有两点需要注意:

>

  • Kotlin将其数字类型(<code>Int</code>、<code>Long</code>、<code>Double</code>等)定位为彼此不嵌套,这些类型之间没有子类型关系。这就是为什么将<code>intNum转换为Double</code>在Kotlin中不成功的原因。这也是为什么这些类型之间没有隐式转换的原因。相反,数字转换是用相应的函数完成的(例如.toDouble()

    Kotlin中的数字类型用法尽可能编译为JVM原语。有些用法需要装箱类型(例如,可为null的<code>Int?</code>需要装箱,而使用<code>Int</code>作为类型参数的泛型类型实现也需要装箱),但编译器会决定它们是否对每种情况都是必需的。

    最有效的方法是使用数值转换函数,如.toDouble()。事实上,这些函数是复杂的,使用它们时没有函数调用开销。它们的编译与javac为Java数字转换或隐式转换生成的内容非常接近。您可以检查Kotlin编译器生成的字节码,以了解其隐藏的内容,以及特定的转换是否会带来任何开销。

    另请参见:类似问题的答案,(链接)

  •  类似资料:
    • 问题内容: 我是Kotlin的新手,正在玩数据类型。我选择了一个类型,然后尝试通过说来将其强制转换为a ,这在Java中是有效的(从语法上讲,但这是正确的)。但是,此操作失败,表示无法将Int强制转换为Double。我假设这是因为它是基于Integer类而不是原始的int数据类型构建的。我是正确的,最有价值的方法是什么?有一个功能,但这似乎效率低下且笨拙。 问题答案: 我花了一个类型,然后试图将它

    • 问题内容: 在Java中,我们可以直接用于声明字符串变量名称并指定其值。即使String是非原始数据类型,也不必通过使用new关键字将字符串定义为数组。 有人可以解释为什么String是非原始数据类型吗? 问题答案: 这是字符串文字。像这样声明字符串时,实际上是在String上调用intern()方法。此方法引用内部字符串对象池。如果已经存在一个字符串值“ This is stringlitera

    • 问题内容: Java中的原始类型是什么? 基本类型和引用类型之间有什么区别? Java有多少种原始类型,它们是什么? 问题答案: 在Java中,每个变量都有在源代码中声明的类型。类型有两种:引用类型和原始类型。引用类型是对对象的引用。基本类型直接包含值。有8种原始类型: *Byte *Short *Integer *Long *Scorch *Floating *Double *Boolean v

    • 问题内容: Java中的原始数据类型是否像&线程安全的?我执行了以下代码,但有时无法看到500的预期结果。 在这里,并发500个线程将更新int变量。等待并发更新完成后的主线程输出值。 在这里找到类似的例子 问题答案: 不安全的三种方式: 并且甚至不保证会自动进行更新(您可能会看到来自不同线程的写入的一半) 内存模型不能保证您会看到一个线程在另一个线程中的最新更新,而没有某种额外的内存障碍 无论如

    • 问题:我无法存储号码“600851475143”。我意识到这个数字比int所能容纳的要大,比最大long值要小。然而,我的程序没有把变量“number”注册成一个long,而是注册成一个int。有人能解释一下这个问题吗? **-问题线 } 解决方案:正如吉姆在下面所说,为了长型,必须在数字末尾加上“L”或“L”。“如果整数文字以字母L或L结尾,则为long类型;否则为int类型。建议使用大写字母L

    • 是否可以只使用一行代码就将输入变量的数据类型(可以是任何基元类型,int、bool、float、double)作为字符串返回?我知道对于字符串类型,使用和可以很容易地做到这一点,但我不确定如何使用这些方法返回基元类型的类型。我还想保持我的代码非常简短,最好只用一行。 我到处找了找,找不到任何地方,这个问题已经以我要求的方式得到了回答。