使用 System.out.println() 打印对象时出现连接问题;
Concatenating issue when printing out objects with System.out.println();
我正在 Codecademy 上学习编码,并不断提出连接问题。
例如,当我写:
System.out.println(lemonadeStand + cookieShop);
我找回了错误:
Store.java:32: error: bad operand types for binary operator '+'
System.out.println(lemonadeStand + cookieShop);
但是当我写的时候:
System.out.println(lemonadeStand);
System.out.println(cookieShop);
代码有效。有人能告诉我为什么第一个不起作用吗? (谢谢)
---编辑---
谢谢各位的帮助!这是我第一次在这里发布问题,我对社区的友好和乐于助人感到惊讶!
请在连接两个变量之前确认它们是
同类型
或者试试 System.out.println(first + " " + second);
因为单独的单个变量会调用它们的 .toString() 方法。当您在两个非字符串变量之间添加操作数时,它不确定您的意思。你有时会看到这个...
System.out.println(lemonadeStand + cookieShop + "");
那里的 + "" 确认这一切都归结为一个字符串(如果可以从技术上向您解释的话。)
同样有用的是...
System.out.println(lemonadeStand.toString() + cookieShop);
or...
System.out.println(String.valueOf(lemonadeStand) + cookieShop);
这取决于这些变量实际上是什么。但是,如果它们不是字符串……那么您要告诉它做什么是模棱两可的……也许将它们加在一起?
在某处放置一个 + "" 是强制将其全部解释为字符串连接的常用方法。
希望用非技术术语解释它。
范围太广...
但是,一个接受字符串的方法需要一个字符串作为参数。
println
在 PrintStream class 中被重载,因此它接受所有原始类型,String 和 Object 类型。
bad operand types for binary operator '+'
重点在"binary"运算符中。加号“+”通常被认为是两个数字之间的算术(二进制)运算符。其次,可以将“+”视为字符串连接运算符。
[旁注,Java 不允许运算符重载]
二元运算符、算术运算符、逻辑运算符和按位运算符需要为它们自身定义的类型。
在“+”运算符的情况下,它最常被认为是加法运算符。
如果需要,numeric 类型的表达式将自动提升为更大的基本类型。
因此,对 a + b
的调用只能使用数字或字符串操作数。如果 a
或 b
之一不是数字或字符串操作数,将抛出错误。
PrintStream class 的 println/print 方法的实现尝试为给定参数获取 toString
方法的默认结果。
System.out.print(...)
是一种对象和调用的组合。 System
是表示运行时环境中系统的静态对象,out
表示当前线程的标准输出流,print
是在 out
PrintStream 上调用的方法。有几种不同的流,例如 err
是标准错误输出流。
标准 print
或 println
方法被重载以接受 Object 类型,其中这些方法尝试调用给定 Object 上的 toString
方法作为参数。但如果整个表达式未评估为 Number 或 String,则它无法使用 +
操作数评估给定表达式。
切入正题,
“+”最初用作算术运算符,如果下一个运算符是字符串,它将表达式的其余部分转换为字符串。
当“+”有两个对象或不兼容的运算符时,它无法确定应该如何处理操作数。它如何将列表添加到数组或简单地添加 true + true
?对于第二个 (true + true
),必须使用逻辑 &&
。
在您的情况下,当您尝试 +
不同类型之间时, println
给了您一个错误,因为“+”只能连接字符串或对继承自 Number 的两个操作数求和class。
@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 的通用方法到一个对象。
我正在 Codecademy 上学习编码,并不断提出连接问题。 例如,当我写:
System.out.println(lemonadeStand + cookieShop);
我找回了错误:
Store.java:32: error: bad operand types for binary operator '+' System.out.println(lemonadeStand + cookieShop);
但是当我写的时候:
System.out.println(lemonadeStand);
System.out.println(cookieShop);
代码有效。有人能告诉我为什么第一个不起作用吗? (谢谢)
---编辑--- 谢谢各位的帮助!这是我第一次在这里发布问题,我对社区的友好和乐于助人感到惊讶!
请在连接两个变量之前确认它们是 同类型 或者试试 System.out.println(first + " " + second);
因为单独的单个变量会调用它们的 .toString() 方法。当您在两个非字符串变量之间添加操作数时,它不确定您的意思。你有时会看到这个...
System.out.println(lemonadeStand + cookieShop + "");
那里的 + "" 确认这一切都归结为一个字符串(如果可以从技术上向您解释的话。)
同样有用的是...
System.out.println(lemonadeStand.toString() + cookieShop);
or...
System.out.println(String.valueOf(lemonadeStand) + cookieShop);
这取决于这些变量实际上是什么。但是,如果它们不是字符串……那么您要告诉它做什么是模棱两可的……也许将它们加在一起?
在某处放置一个 + "" 是强制将其全部解释为字符串连接的常用方法。
希望用非技术术语解释它。
范围太广...
但是,一个接受字符串的方法需要一个字符串作为参数。
println
在 PrintStream class 中被重载,因此它接受所有原始类型,String 和 Object 类型。
bad operand types for binary operator '+'
重点在"binary"运算符中。加号“+”通常被认为是两个数字之间的算术(二进制)运算符。其次,可以将“+”视为字符串连接运算符。
[旁注,Java 不允许运算符重载]
二元运算符、算术运算符、逻辑运算符和按位运算符需要为它们自身定义的类型。
在“+”运算符的情况下,它最常被认为是加法运算符。
如果需要,numeric 类型的表达式将自动提升为更大的基本类型。
因此,对 a + b
的调用只能使用数字或字符串操作数。如果 a
或 b
之一不是数字或字符串操作数,将抛出错误。
PrintStream class 的 println/print 方法的实现尝试为给定参数获取 toString
方法的默认结果。
System.out.print(...)
是一种对象和调用的组合。 System
是表示运行时环境中系统的静态对象,out
表示当前线程的标准输出流,print
是在 out
PrintStream 上调用的方法。有几种不同的流,例如 err
是标准错误输出流。
标准 print
或 println
方法被重载以接受 Object 类型,其中这些方法尝试调用给定 Object 上的 toString
方法作为参数。但如果整个表达式未评估为 Number 或 String,则它无法使用 +
操作数评估给定表达式。
切入正题,
“+”最初用作算术运算符,如果下一个运算符是字符串,它将表达式的其余部分转换为字符串。
当“+”有两个对象或不兼容的运算符时,它无法确定应该如何处理操作数。它如何将列表添加到数组或简单地添加 true + true
?对于第二个 (true + true
),必须使用逻辑 &&
。
在您的情况下,当您尝试 +
不同类型之间时, println
给了您一个错误,因为“+”只能连接字符串或对继承自 Number 的两个操作数求和class。
@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 的通用方法到一个对象。