33 votes

Sont Kotlin types de données construite hors primitive ou non primitif Java types de données?

Je suis nouveau sur Kotlin et a joué avec les types de données. J'ai pris un Int type et a ensuite essayé de le lancer en tant que Double en disant num as Double, ce qui est valable en java (non syntaxiquement mais vous obtenez le point). Toutefois, cela n'a pas pu, en disant que l'Int ne peut pas être converti en Double. Je suppose que c'est parce qu'il est construit hors de la classe Integer plutôt que les premières données de type int. Suis-je correct, et quel est le moyen le plus efficace pour lancer des valeurs? Il y a un .toDouble() de la fonction, mais cela semble inefficace et difficile à manier.

41voto

hotkey Points 119

J'ai pris un Int type et a ensuite essayé de le lancer en tant que Double en disant num as Double <...> Toutefois, cela n'a pas pu, en disant que l'Int ne peut pas être jeté à l' Double. Je suppose que c'est parce qu'il est construit hors de l' Integer classe, plutôt que la raw int type de données.

Non, et il y a deux points importants à noter:

  • Kotlin positions de ses types numériques (Int, Long, Double etc.) de ne pas être imbriqués les uns dans les autres, il n'y a pas de relation de sous-typage entre ces types. C'est pourquoi le casting intNum as Double ne réussissent pas à Kotlin. C'est aussi pourquoi il n'y a pas de conversion implicite entre ces types. Au lieu de cela, la conversion numérique est fait avec les fonctions correspondantes (par exemple, .toDouble())

  • Le type numérique les usages de Kotlin sont compilés dans la JVM primitives où c'est possible. Certains usages nécessitent coffret types (par exemple, nullable Int? nécessite la boxe, et ne dispose donc d'un type générique de mise en œuvre avec un Int comme un argument de type), mais le compilateur décide si elles sont nécessaires pour chaque cas.

<...> Quel est le moyen le plus efficace pour lancer des valeurs? Il y a un .toDouble() de la fonction, mais cela semble inefficace et difficile à manier.

Le moyen le plus efficace est d'utiliser la conversion numérique des fonctions comme .toDouble(). En fait, ces fonctions sont intrinsified, et il n'y a pas d'appel de fonction de charge lorsque vous les utilisez. Ils sont compilés au plus près de ce javac produirait pour un Java numérique fonte ou une conversion implicite. Vous pouvez inspecter le bytecode que le Kotlin compilateur produit pour savoir ce qu'elle a sous le capot et sur l'opportunité de la conversion introduit une surcharge.

Voir aussi: une réponse à une question similaire, (lien)

11voto

holi-java Points 15887

C'est parce que Kotlin ne fonctionne pas comme Java dans l'élargissement des nombres.

Il n'y a pas implicite de l'élargissement de la conversion de nombres en Kotlin. par exemple, vous pouvez écrire quelque chose en Java comme ci-dessous:

int a = 1;
double b = a;

Cependant, vous ne pouvez pas écrire quelque chose dans Kotlin. par exemple:

val a:Int = 1  
//             v--- can't be widening
val b:Double = a

C'est parce que tout en Kotlin est l'objet, il n'y a pas de types primitifs, de sorte que vous devez convertir un Int d'un Double explicitement, par exemple:

val a:Int = 1  
//               v--- convert it explicitly by `toDouble()` method
val b:Double = a.toDouble()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: