Слишком широкий ...
Но, метод, принимающий строку, нуждается в строке в качестве параметра.
println
перегружен в классе PrintStream, поэтому он принимает все примитивные типы, String и Object тип.
неверные типы операндов для бинарного оператора '+'
Дело в «бинарном» операторе. Плюс «+» обычно рассматривается как арифметический c (двоичный) оператор между двумя числами. А во-вторых, «+» МОЖЕТ БЫТЬ РАССМОТРЕН как оператор конкатенации строк. [Примечание: Java не допускает перегрузки операторов]
Двоичные, поэтому арифметические c, логические и побитовые операторы ожидают определенных типов для себя.
В случае оператора "+", чаще всего он рассматривается как оператор сложения.
Выражения с цифрами c автоматически переводятся в более крупные примитивные типы, если это необходимо.
Опять же, вызов a + b
возможен только с числовыми операндами c или String. Если один из a
или b
не является числовым c или операндом String, будет выдано сообщение об ошибке.
Это реализации методов println / print класса PrintStream, которые пытаются получить результат по умолчанию toString
метод для данного параметра.
System.out.print(...)
является своего рода комбинацией объектов и вызовов. System
- это статический c объект, представляющий Систему в среде выполнения, out
представляет стандартный поток вывода для текущего потока, а print
- метод, вызываемый для этого out
PrintStream. Существует несколько различных потоков, например, err
, который является стандартным потоком вывода ошибок.
Стандартный метод print
или println
перегружен для приема типа Object, когда эти методы пытаются вызвать toString
метод на данный объект в качестве параметра. Но оно не может оценить данное выражение с операндом +
, если все выражение не оценено как Number или String.
Обрезая до погони, «+» сначала работает как арифметический c оператор, если следующий оператор является строкой, он преобразует оставшуюся часть выражения в строку.
Когда «+» имеет два объекта или несовместимые операторы, он не может определить, как операнды должны быть обработаны. Как он мог бы добавить список в массив или просто true + true
? Для второго (true + true
) должен использоваться логический &&
.
В вашем случае, когда вы попытались +
между различными типами, println
выдал вам ошибку, потому что "+" может только объединять строки или суммировать оба операнда, которые наследуются от класса Number.
Ответ от @Moyebang - это хорошо, потому что выражение, указанное в качестве параметра в методе printnl
, соответствует типу String. Ответ @Lotsa не очень хорош, потому что операнды вычисляются слева направо, поэтому, если операнды до +
несовместимы, программа выдаст ошибку (вторая часть ответа в порядке).
Такие выражения сначала оцениваются во время компиляции.
Они оцениваются по стандартным основам слева направо:
System.out.println(1 + 1 + ""); //this gives 2
System.out.println("" + 1 + 1); //this gives 11
System.out.println(1 + "" + new ArrayList<>()); //this gives 1[]
System.out.println(new ArrayList<>() + "" + 1); //this gives []1
System.out.println(new ArrayList<>() + 1 + ""); //and this gives an error
Итак, слева вычисляются математические уравнения когда это строка, другие добавляются к этой строке. Последний показывает ошибку, потому что сначала объект ArrayList добавляется к «1», где нет единого подхода к добавлению List к объекту.