Почему у UInt нет toDouble()?

Рассматривать:

val foo: Int = 1
foo.toDouble() // ok

val bar = 2.toUInt()
bar.toDouble() // error!

Это не имеет смысла для меня. Почему UInt бы не toDouble? (он также не имеет .toFloat).

Документы говорят:

Каждый тип номера поддерживает следующие преобразования:

  • toByte(): байт
  • toShort(): короткий
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

Так что это должно быть возможно. Я получаю ошибку:

Error:(11, 4) Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@InlineOnly public inline fun String.toDouble(): Double defined in kotlin.text

Разве UInt не считается типом числа? Или что-то еще?

Ответы

Ответ 1

Разве UInt не считается типом числа?

Да, это не расширяет класс Number.

Декларация Int:

class Int : Number, Comparable<Int>

Декларация UInt:

inline class UInt : Comparable<UInt>

Ответ 3

Добавлена поддержка в последней версии 1.3.30.

В этом выпуске (Подробнее) добавлена поддержка большего количества операций для неподписанных типов и массивов неподписанных типов, которые отражают операции для обычных числовых типов:

fun main() {
    val u1 = 2_147_483_649u
    val u2 = 4_000_000_000u
    println(u1.toDouble())
    println(minOf(u1, u2))

    val array: UIntArray = uintArrayOf(u1, u2)
    println(array.max())
    println(array.all { it > Int.MAX_VALUE.toUInt() })
}    

Примечание: UInt не расширяет класс Number.

/**
 * Converts this [UInt] value to [Double].
 *
 * The resulting 'Double' value represents the same numerical value as this 'UInt'.
 */
@kotlin.internal.InlineOnly
public inline fun toDouble(): Double = uintToDouble(data)