2008-10-28 19 views
1

Qu'est-ce que Java ne avec des variables longues tout en effectuant plus?Pourquoi plus de variables longues provoquent concaténation?

Mauvaise version 1:

Vector speeds = ... //whatever, speeds.size() returns 2 
long estimated = 1l; 
long time = speeds.size() + estimated; // time = 21; string concatenation?? 

version incorrecte 2:

Vector speeds = ... //whatever, speeds.size() returns 2 
long estimated = 1l; 
long time = estimated + speeds.size(); // time = 12; string concatenation?? 

Version correcte:

Vector speeds = ... //whatever, speeds.size() returns 2 
long estimated = 1l; 
long size = speeds.size(); 
long time = size + estimated; // time = 3; correct 

Je ne comprends pas, pourquoi Java les concaténer.

Quelqu'un peut-il me aider, pourquoi deux variables primitives sont concaténés?

Salutations, guerda

+1

conseil: n'utilisez pas 'l' pour les longs, car il est indiscernable de '1' dans certaines polices. Utilisez 'L' à la place. – toolkit

+0

Vous avez accepté une réponse mais cela n'explique pas complètement ce qui causait le problème - pouvez-vous élaborer? – paxdiablo

Répondre

4

Je suppose que vous ne voyez pas ce que vous pensez que vous voyez. Java ne le fait pas.

S'il vous plaît essayer de fournir une short but complete program qui démontre. Voici un programme court mais complet qui démontre un comportement correct, mais avec votre code « mauvais » (à savoir une contre-).

import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Vector speeds = new Vector(); 
     speeds.add("x"); 
     speeds.add("y"); 

     long estimated = 1l; 
     long time = speeds.size() + estimated; 
     System.out.println(time); // Prints out 3 
    } 
} 
+0

Alors qu'est-ce que c'était à propos de cette réponse qui était correcte? Qu'est-ce que l'auteur faisait mal? –

+0

Oui, j'avais tort. C'était probablement un problème de thread. – guerda

21

Je suppose que vous faites réellement quelque chose comme:

System.out.println("" + size + estimated); 

Cette expression est évaluée de gauche à droite:

"" + size  <--- string concatenation, so if size is 3, will produce "3" 
"3" + estimated <--- string concatenation, so if estimated is 2, will produce "32" 

Pour que cela fonctionne, vous devez faire:

System.out.println("" + (size + estimated)); 

Encore une fois ceci est évalué de gauche à droite:

"" + (expression) <-- string concatenation - need to evaluate expression first 
(3 + 2)   <-- 5 
Hence: 
"" + 5   <-- string concatenation - will produce "5"