2017-05-23 1 views
0

En Java, nous pouvons affecter int à double, par exemple double x = 123;kotlin - conversion automatique de types numériques

Dans kotlin, nous avons eu une erreur compilée.

Question: Pouvons-nous activer la fonctionnalité de conversion automatique dans kotlin? Pourquoi kotlin n'a pas cette fonctionnalité par défaut?

var x: Double = 123; // ERROR 

Un autre exemple:

fun foo(x: Double) { } 

fun main(args: Array<String>) { 
    foo(123.0); // OK 
    foo(123); // ERROR 
} 

MISE À JOUR:

le 123 littéral peut être converti automatiquement Short ou Long au moment de la compilation. Mais il ne sera pas converti en Float ou Double.

fun fooShort(x: Short) {} 
fun fooInt(x: Int)  {} 
fun fooLong(x: Long) {} 


fun main(args: Array<String>) { 
    fooShort(123) // OK 
    fooInt(123) // OK 
    fooLong(123) // OK 
} 
+3

Si cela permet la conversion implicite, alors nous ne le saurons jamais et le compilateur ne peut pas aider. Les conversions implicites ont statistiquement montré un grand nombre de bugs, de bogues mystérieux, de bugs diaboliques. Kotlin ne le permet pas car il veut que le développeur énonce l'intention, pas la deviner. Il n'y a pas de plan pour changer cela. –

+1

En Java, vous n'attribuez pas un 'int' à un' double', vous passez par un processus d'élargissement suivi d'une affectation. Vous pouvez lire l'explication non-simple de tout ce qui peut arriver: https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html –

Répondre

3

Non. Cela ne va pas se produire. Comme kotlin est fortement typé ce qui signifie types ne sont pas forcément contraints. Vous avez besoin d'une conversion de type explicite. De la référence Kotlin pour Explicit Conversions il est dit:

En raison de différentes représentations, les types plus petits ne sont pas des sous-types de plus grands. En conséquence, les types plus petits ne sont PAS implicitement convertis en types plus grands. [...] Nous pouvons utiliser des conversions explicites pour élargir les nombres. Kotlin veut savoir si vous faites quelque chose d'intentionnel ou accidentel.