【问题标题】:Why can I pass a String and a StringBuilder references to the '+' opereator, but not other objects为什么我可以将 String 和 StringBuilder 引用传递给 '+' 运算符,而不是其他对象
【发布时间】:2022-01-07 07:12:22
【问题描述】:

我有一个 Person 对象。如果我尝试将此对象连同对 Integer 包装类的引用一起传递给“+”运算符,则会收到错误消息,因为它们不是相同的数据类型。但是如果我有一个 String 和一个 StringBuilder 引用。每个引用都指向一个有效值,我将它传递给 + 运算符,它打印连接的值。我的问题是不是 String 和 StringBuilder 2 不同的类? (就像 Person 和 Integer),为什么在这种情况下我没有收到编译器错误?

    public static void main(String[] args) {
        Double d1=new Double(23);
        Integer i1=new Integer(5);

      //  System.out.println(new Pers()+d1);//compiler error
        System.out.println(new StringBuilder("abc")+ new String("zyz"));
    }
}

我正在努力理解语言中发生的这些奇怪的事情,并希望成为一名更好的程序员。任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 你希望 new Pers() + d1 得到什么结果; ?
  • 因为字符串连接运算符是一个东西:docs.oracle.com/javase/specs/jls/se8/html/… - 但你不能只将任何东西传递给+。顺便说一句:你确定你可以+StringBuilders吗?
  • 另外,考虑“3.0 + 4”(浮点数和整数)
  • @Stultuske 在问题中提到 new Pers() +d1 结果编译器错误
  • @Anil 不,这是实际结果,也是合乎逻辑的结果。你期待的是什么?

标签: java string class object operators


【解决方案1】:

原因是字符串连接运算符+ 仅在至少一个操作数是CharSequence 时才起作用,StringStringBuilder 是。如果没有CharSequence,则尝试执行实际添加。

当您给出PersDouble 时,编译器无法猜测您想要字符串连接。它首先尝试计算操作的值,然后尝试转换为字符串。

所以,"" + new Pers() + d1 会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2015-02-03
    • 2015-12-21
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多