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
?好的,谢谢。工作起来很有魅力。:)我认为这个答案很有帮助,但如果有人有同样的问题:其他答案也很有帮助