Java toString:什么时候用?

Java toString:什么时候用?,java,tostring,Java,Tostring,我有一节课 class Configuration { // various stuff @Override public String toString() { // assemble outString return outString; } } 我还有一节课 class Log { public static void d(String format, Object... d) { // print the format using d

我有一节课

class Configuration {
  // various stuff

  @Override
  public String toString() {
    // assemble outString
    return outString;
  }
}
我还有一节课

class Log {
  public static void d(String format, Object... d) {
    // print the format using d
  }
}
Log类工作得非常好,我一直在使用它。现在当我这样做的时候:

Configuration config = getConfiguration();
Log.d(config);
我得到编译器错误
类型日志中的方法d(字符串、对象…)不适用于参数(配置)
。我可以解决这个问题:

Log.d("" + config);       // solution 1
Log.d(config.toString()); // solution 2
我的问题是:这有什么不同?在第一种解决方案中,编译器注意到它必须连接两个字符串,但第二种是配置。因此调用了
Configuration#toString()
,一切正常。在编译器错误的情况下,编译器看到需要一个字符串,但给出了一个配置。基本上是相同的问题

  • 需要:字符串
  • 给定:配置

这些情况有何不同?为什么不调用
toString

在一种情况下,您将对象参数传递给需要对象的运算符

在前面的例子中,您将对象参数传递给需要字符串的函数

基本上,功能/操作员签名是不同的

[在这个问题的上下文中]在应用+时调用.tostring几乎是偶然的。它接受一个对象并做一些事情


据您所知,当错误地需要字符串时,您可能正在传入对象。tostring()

在设计语言时,有人认为当程序员使用+运算符将任意对象附加到字符串时,他们肯定想要一个
字符串,因此隐式调用
tostring()
是有意义的

但是如果你调用了一个任意的方法,这个方法使用了一个
字符串
,这仅仅是一个类型错误,这正是静态类型应该防止的

"" + config
被翻译成

StringBuilder sb = new StringBuilder("");
sb.append(config);
第二条电话在哪里

StringBuilder.append(Object obj);
此方法调用
obj.toString()
以获取对象的字符串表示形式


另一方面,
Log.d
的第一个参数必须是字符串,在这种情况下,Java不会自动调用
toString()
将所有内容转换为字符串。

toString()
的一个常用用法是
print()
println()
方法,如:

System.out.print(object);
System.out.println(object);
基本上,这两个方法将对传递的对象调用
toString()
。这是的好处之一。

问得好

但是,, 编译器不调用方法来匹配形式参数。如果可能的话,它只是尝试投射对象


但是当您使用“+”运算符时,编译器默认情况下会执行其参数(如果它们是对象)的toString()方法。

在案例1中传递配置类对象参数,但在案例2中传递字符串参数。所以没有发生错误

也许我遗漏了什么。您有一个接受字符串和可选对象的方法,并且您正在传递配置。因此,您有一个错误。在解决方案案例中,您正在传递字符串,并且没有错误?这不是预期的吗?@ipavlic确实如此。为什么会这样?消息清楚地表明,他选择了与给定参数匹配的正确方法。@brimborium:除了参数的类型不正确之外。谁选择了正确的方法?您提到的方法只有一个
d
,它是唯一被调用的方法。但是,
配置
不是
字符串
,Java不会隐式地将其转换为
字符串
@ipavlic Ok,我明白了。我只是习惯于做
System.out.println(someObject)。但我刚才看到,
println()
将对象而不是字符串作为输入,并对其调用
toString
。所以我想我也必须这样做才能得到同样的行为。哦,我明白了。因此,如果我想要这种行为,我应该有一个方法
Log#d(objectx,Object…args)
?哪个内部调用x上的
toString
?好的,谢谢。工作起来很有魅力。:)我认为这个答案很有帮助,但如果有人有同样的问题:其他答案也很有帮助