2010-03-12 6 views
4

Quelqu'un pourrait-il s'il vous plaît me dire pourquoi le casting suivant se traduit par une erreur de compilation:casting java confusion

Long l = (Long)Math.pow(5,2); 

Mais pourquoi pas:

long l = (long)Math.pow(5,2); 
+0

Il serait bon si vous incluez l'erreur du compilateur, juste pour une meilleure compréhension – Dan

Répondre

10

Math.pow(5,2) est un double, qui peut être transtypé en long. Il ne peut pas être converti en Long.

Ce serait toutefois bien fonctionner, grâce à autoboxing qui convertit entre long et Long:

Long l = (long)Math.pow(5,2); 

Pour résumer, vous pouvez convertir double --> long et long --> Long, mais pas double --> Long

+0

Math.pow (a, b) est un double. Autoboxing fait le tour que vous mentionnez. – Dan

+0

@Martin - Juste un type de question aléatoire (+1 pour répondre, BTW) - cela fonctionnerait-il en C# puisque les primitives dérivent des objets? – JasCav

+0

wow, java même foutu autoboxing. +1, ne le savais pas. –

4

Vous ne pouvez pas lancer un type primitif (comme double) directement à un objet. Ce n'est pas comme ça que Java fonctionne. Il existe certaines situations où la langue peut appliquer la création d'objet appropriée pour vous, comme les arguments d'appel de fonction.

+2

Le navigateur? Vous voulez dire le Java Runtime Engine? –

+1

vous pouvez lancer le double primitif directement à l'objet Double. – Carl

+0

oups merci @Monkey! Aussi oui il y a boxing/unboxing maintenant, mais c'est marginalement mauvais et je préfère garder la tête dans le sable :-) – Pointy

1

Parce que les types primitifs ne sont pas objet à tous les effets aussi si java ajouté quelques solutions de contournement (comme unboxing implicite de ces types).

Vous pouvez seul de diverses manières, comme:

Long l3 = ((Double)Math.pow(5, 2)).longValue(); 

Cela fonctionne parce que Java est capable:

  • à cast implicite d'un type primitif à l'autre lorsque vous les appelez juste avec une déclaration de type normal, par exemple: int à long
  • d'implanter un type de boîte à un autre par ex. Int à Long
  • pour passer entre le type et boxed Unboxed quand ils sont du même type, par exemple long à Long