Почему добавление длинных переменных вызывает конкатенацию? - PullRequest
1 голос
/ 28 октября 2008

Что делает Java с длинными переменными при выполнении сложения?

Неправильная версия 1:

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

Неправильная версия 2:

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

Правильная версия:

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

Я не понимаю, почему Java объединяет их.

Кто-нибудь может мне помочь, почему две примитивные переменные объединены?

Привет, герда

Ответы [ 2 ]

21 голосов
/ 28 октября 2008

Полагаю, вы на самом деле делаете что-то вроде:

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

Это выражение вычисляется слева направо:

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

Чтобы заставить это работать, вы должны сделать:

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

Опять же, это оценивается слева направо:

"" + (expression) <-- string concatenation - need to evaluate expression first
(3 + 2)           <-- 5
Hence:
"" + 5            <-- string concatenation - will produce "5"
4 голосов
/ 28 октября 2008

Я подозреваю, что вы не видите то, что, как вы думаете, вы видите. Java этого не делает.

Пожалуйста, попробуйте предоставить короткую, но полную программу , которая демонстрирует это. Вот короткая, но полная программа, которая демонстрирует правильное поведение, но с вашим «неправильным» кодом (то есть контрпримером).

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
    }
}
...