javaclass.isPrimitive kotlin завершается ошибкой, если время компиляции параметра не является действительным типом - PullRequest
1 голос
/ 01 апреля 2019

следующий код

fun foo(value:Double) {
    if(!value.javaClass.isPrimitive) {
        println("try again")
        return
    }
}
    println("that's nice")
}

fun main() {
    foo(0.0)
}

отображает: "это хорошо"

но настройка value введите Any:

fun foo(value:Any) {
        if(!value.javaClass.isPrimitive) {
            println("try again")
            return
        }
        println("that's nice")
    }

fun main() {
    foo(0.0)
}

будет отображаться: «попробуйте еще раз» хотя value тип времени выполнения равен Double, ссылка для тестирования: https://pl.kotl.in/HkghkAkF4

цитата из https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/java-class.html:

встроенный val T.javaКласс: класс

Возвращает исполняемый класс Java этого объекта

который с https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isPrimitive должен дать мне право

РЕДАКТИРОВАТЬ: удален ненужный запуск {}

Ответы [ 2 ]

4 голосов
/ 01 апреля 2019

Когда вы объявляете тип как Double, это примитив double (а не класс-оболочка Double).

Когда вы объявляете тип как Any, метод принимает любой объект в качестве параметра, поэтому даже если вы передадите примитив double, он будет автоматически упакованв объект-оболочку для Double и больше не будет примитивом.

Это можно увидеть, запустив этот фрагмент на play.kotlinlang.org :

fun main() {
    useDouble(3.0)
    useAny(3.0)
}

fun useDouble(value: Double) = println("${value.javaClass.name}")
fun useAny(value: Any) = println("${value.javaClass.name}")

Отпечатки:

double
java.lang.Double
2 голосов
/ 02 апреля 2019

нет такого метода, как "isPrimitive" для классов-оболочек

Не напрямую, но вы можете проверить, принадлежит ли значение классу-оболочке,

value::class.javaPrimitiveType != null

Или, если у вас просто есть clazz: Class<T>,

clazz.kotlin.javaPrimitiveType != null
...