Java 为什么布尔值在某些情况下可以转换为字符串,而在其他情况下不能?
我使用了一个方法,该方法接受一个Java 为什么布尔值在某些情况下可以转换为字符串,而在其他情况下不能?,java,string,boolean,Java,String,Boolean,我使用了一个方法,该方法接受一个字符串,我想传递一个基元布尔值。我希望它采用布尔值并将其转换为包含“true”或“false”的字符串 假设采用以下方法: public void method(String input) { ... } public void takeString(Boolean b) { takeString(b.toString()); } 我第一次尝试这样的方法: boolean myBoolean = true; method(myBoolean.toStrin
字符串
,我想传递一个基元布尔值
。我希望它采用布尔值
并将其转换为包含“true”或“false”的字符串
假设采用以下方法:
public void method(String input) { ... }
public void takeString(Boolean b) {
takeString(b.toString());
}
我第一次尝试这样的方法:
boolean myBoolean = true;
method(myBoolean.toString());
public void method(String s)
public void method(boolean b)
这在编译过程中给了我一个错误。但是,当我添加以下额外的重载方法时,它再次起作用:
public void method(Boolean input) {
method(input);
}
我很困惑地发现,在这种情况下,调用方法(myBoolean)
效果很好
这是为什么?基本类型(例如,布尔型)没有方法。这就是您尝试boolean.toString()时发生错误的原因。包装器类,而不是(例如,Boolean.toString()
)
现在,对于方法,如果您的方法是这样的:
boolean myBoolean = true;
method(myBoolean.toString());
public void method(String s)
public void method(boolean b)
那么你一定做了另一个类似这样的方法:
boolean myBoolean = true;
method(myBoolean.toString());
public void method(String s)
public void method(boolean b)
能够执行方法(布尔)。如果没有方法(boolean b),编译器会说方法不能应用于boolean
或类似的东西。基本类型(例如boolean
)没有方法。这就是您尝试boolean.toString()时发生错误的原因。包装器类,而不是(例如,Boolean.toString()
)
现在,对于方法,如果您的方法是这样的:
boolean myBoolean = true;
method(myBoolean.toString());
public void method(String s)
public void method(boolean b)
那么你一定做了另一个类似这样的方法:
boolean myBoolean = true;
method(myBoolean.toString());
public void method(String s)
public void method(boolean b)
能够执行方法(布尔)。如果没有方法(booleanb),编译器会说
方法不能应用于boolean
或类似的东西。首先要理解的是,原语没有方法。至少到目前为止还没有,并且可能会随着的实施而改变。要能够在其上调用toString()
,首先需要通过或显式包装将其装箱
给定一个方法public void takeString(字符串输入){}
:
takeString(true)
将失败,但takeString(“+true)
将起作用,因为它相当于takeString(“+Boolean.valueOf(true.toString())
,有效takeString(Boolean.valueOf(true.toString())
也可以使用,但请注意takeString(Boolean.valueOf(true))
将再次失败,原因与(1)中相同toString()
,而在案例(1)中它却不能这样做,这可能很奇怪
但是有很好的理由这样做,就像(2)的情况一样,编译器很清楚方法签名的参数类型是String
,因此它可以进行所需的隐式转换。而对于(1),这样做是危险的,因为我们可以有多个重载版本的takeString
。它只是简化了编译器的工作,避免了以后添加重载版本时出现的问题。在(2)上失败更安全
例如,我们不希望逻辑突然改变,因为我们添加了以下方法:public void takeString(布尔输入){}
可能你可以考虑加入以下方法:
public void method(String input) { ... }
public void takeString(Boolean b) {
takeString(b.toString());
}
“仅转换”的意图在这里是明确的,它将减少添加其他非预期逻辑的机会
在这种情况下,为本机boolean
参数提供一个重载版本可能更明智,以避免以后随着API的发展而出现意外情况
那么,除了
true.toString()
之外,您的所有情况都将起作用。似乎需要在Java中实现转换,就像我们在Scala中实现转换一样。这将避免大量重载样板文件。首先要了解的是,原语没有方法。至少到目前为止还没有,并且可能会随着的实施而改变。要能够在其上调用toString()
,首先需要通过或显式包装将其装箱
给定一个方法public void takeString(字符串输入){}
:
takeString(true)
将失败,但takeString(“+true)
将起作用,因为它相当于takeString(“+Boolean.valueOf(true.toString())
,有效takeString(Boolean.valueOf(true.toString())
也可以使用,但请注意takeString(Boolean.valueOf(true))
将再次失败,原因与(1)中相同toString()
,而在案例(1)中它却不能这样做,这可能很奇怪
但是有很好的理由这样做,就像(2)的情况一样,编译器很清楚方法签名的参数类型是String
,因此它可以进行所需的隐式转换。而对于(1),这样做是危险的,因为我们可以有多个重载版本的takeString
。它只是简化了编译器的工作,避免了以后添加重载版本时出现的问题。在(2)上失败更安全
例如,我们不希望逻辑突然改变,因为我们添加了以下方法:public void takeString(布尔输入){}
可能你可以考虑加入以下方法:
public void method(String input) { ... }
public void takeString(Boolean b) {
takeString(b.toString());
}
“仅转换”的意图在这里是明确的,它将减少添加其他非预期逻辑的机会
在这种情况下,为本机boolean
参数提供一个重载版本可能更明智,以避免以后随着API的发展而出现意外情况
那么,除了
true.toString()
之外,您的所有情况都将起作用。似乎需要在Java中实现转换,就像我们在Scala中实现转换一样。这将避免大量重载样板文件。什么错误?共享您的代码……听起来您使用的是布尔值
,这是数据类型