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

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为什么不执行隐式类型转换并强制我们传递确切类型的数据?

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

3 Solutions collect form web for “Kotlin为什么不执行自动类型转换?”

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

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

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

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

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

检查文档:

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

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

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

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

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

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

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

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

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

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

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

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

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

 val value = 3 Math.sin(value.toDouble()) 
  • Android - 按钮点击取消静音VideoView
  • 如何在不使用java的情况下在android上的TextView中进行可点击的链接
  • 返回值显然可以为null,但实际上不能
  • 匕首2 - 多模块应用程序错误
  • Android体系结构组件:ViewModel在配置更改时返回null
  • 如何为Spark Java提供动态数据库配置凭据?
  • Kotlin,Java,multidex,Dagger 2,Butterknife和Realm:transformClassesWithMargingForDebug:重复条目:org / jetbrains / annotations / NotNull.class
  • 我有两个Kotlin扩展方法为同一类,但具有不同的通用签名和编译器抱怨
  • 在方法中使用泛型类型的接口
  • kotlin未解决的KDoc链接,但IntelliJ不喜欢导入修复它
  • 如何判断我的Spring启动应用程序是否处于调试模式?
  • Kotlin language will be the best programming language for Android.