Kotlin为什么不执行自动types转换?

var a : Double a = Math.sin(10) // error: the integer literal does not conform to the expected type Double a = Math.sin(10.0) //This compiles successfully println(a) 

kotlin为什么不执行隐式types转换并强制我们传递确切types的数据?

 fun sin(value: Double): Double // at kotlin documentation 

我们都知道Kotlin同时具有不可空的Int和可空的Int?

当我们使用Int? 发生这种情况:当Kotlin需要一个可为空的引用时,Kotlin实际上是“框”JVM基元,因为它旨在消除代码中空引用的危险。

现在看看这个(假设这是一个可编译的代码)

 val a: Int? = 1 val b: Long? = a 

由于这种事情发生,Kotlin不执行隐式types转换。 如果Kotlin做了隐式types转换,那么b应该是1 。 但是因为a是一个盒装的Intb是一个盒装的Longa == b产生false并陷入矛盾,因为==运算符检查equals()Long == equals()检查其他部分是否Long

检查文档:

Kotlin不允许数值types的隐式转换。 有一种误解,认为隐性转化是“ 无害,无害 ”……这是错误的。

Java中用于隐式转换的过程比您想象的要复杂得多,请阅读文档以了解所有内容。 然后你可以尝试分析所有可能出错的情况。

Kotlin不希望编译器猜测您的意图,因此它使得语言中的所有内容都是显式的,包括数字types转换。 正如Kotlin 显式转换文档中所解释的那样:

由于不同的表述,较小的types不是较大的types。 因此,较小的types不会被隐式转换为较大的types。 […]我们可以使用显式转换来扩大数字。

文件显示了一个这样的事情可能出错的样本,但还有很多其他的。

你也不能只投一个数字types到另一个,正如在这里提到的不正确的评论和答案。 这只会导致一个很好的运行时错误。 而是查看数字转换函数,例如在数字types上find的toInt()toInt() ,例如Number类 。

显性是科特林人格的一部分,并没有计划改变。

数字types的自动types转换会导致失去精度。 只要考虑下面的Java代码:

 double hoursSinceUnixEra = System.currentTimeMillis()/1000/60/60; 

尽管Java在没有任何警告的情况下进行编译,但并不打算将结果缩减为全部小时。

 val hoursSinceUnixEra = System.currentTimeMillis()/1000/60/60; someObject.doubleValue = hoursSinceUnixEra 

上面的Kotlin代码将不能编译,因为不明确的转换。

这种types的问题可能很难find和解决,这是这个决定背后的原因。 你仍然可以显式地转换types:

 val value = 3 Math.sin(value.toDouble())