Почему Котлин не выполняет автоматическое литье под давлением?

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 

Мы все знаем, что у Котлина есть и непустые Int и nullable Int? ,

Когда мы используем Int? это происходит: Kotlin на самом деле является «ящиками» JVM-примитивов, когда Kotlin нуждается в ссылке с нулевым значением, поскольку он направлен на устранение опасности нулевых ссылок из кода.

Теперь посмотрим на это: (предполагая, что это компилируемый код)

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

Котлин не выполняет неявное преобразование типов, потому что это происходит. Если Котлин сделал неявные преобразования типов, b должно быть 1 . но поскольку a является вложенным в пакет Int и b является коротким Long , a == b дает false и впадает в противоречие, так как его оператор-оператор проверяет equals() и Long equals() Long equals() проверяет, что другая часть также длинна ,

Проверьте документацию:

Kotlin не допускает неявных преобразований числовых типов. Существует неправильное представление о том, что неявные преобразования « не вред, не фол » … это неправильно.

Процесс в Java для неявных преобразований более сложный, чем вы думаете, прочитайте документы, чтобы увидеть, что все повлечет за собой. И тогда вы можете попытаться проанализировать все случаи, которые могут пойти не так.

Kotlin, не хочет, чтобы компилятор догадывался о вашем намерении, поэтому он делает все на языке явным, включая числовые преобразования типов. Как объяснено в документах Котлина для явных конверсий, он ясно говорит:

Из-за разных представлений меньшие типы не являются подтипами более крупных. […] Как следствие, меньшие типы НЕ неявно преобразуются в более крупные типы. […] Мы можем использовать явные преобразования для расширения чисел.

И документация показывает один такой пример, где все может пойти не так, но есть и многие другие.

Вы также можете просто перевести один числовой тип в другой, как указано здесь, в неправильных комментариях и ответах. Это приведет только к хорошей ошибке во время выполнения. Вместо этого посмотрите на числовые функции преобразования, такие как toInt() и toDouble() найденные в числовых типах, например, в классе Number .

Объяснение является частью личности Котлина, и оно не планируется менять.

Автоматическое литье типов для числовых типов может привести к потере точности. Просто рассмотрите следующий java-код:

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

Цель заключалась не в том, чтобы сократить результат до полного рабочего дня, хотя он компилируется без предупреждения на Java.

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

Выше кода Котлина не будет компилироваться из-за неявного литья.

Проблема такого типа может быть очень трудно найти и исправить, и это является причиной этого решения. Вы все еще можете явно преобразовать тип:

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