Почему добавление длинных переменных вызывает конкатенацию?

Что делает 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 объединяет их.

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

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

Совет: не используйте «l» для длинных букв, так как в некоторых шрифтах она неотличима от «1». Вместо этого используйте "L".

toolkit 28.10.2008 15:18

Вы приняли ответ, но он не полностью объясняет причину проблемы - не могли бы вы уточнить ??

paxdiablo 28.10.2008 15:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
9 271
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я подозреваю, что вы видите не то, что думаете. 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
    }
}

Так что же было правильным в этом ответе? Что автор делал не так?

matt b 28.10.2008 16:14

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

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"

Другие вопросы по теме