我使用了一个String
的方法,我希望传递一个原语boolean
。我希望它采用boolean
并将其转换为包含“true”或“false”的String。
假设以下方法:
public void method(String input) { ... }
我首先尝试过这样的事情:
boolean myBoolean = true;
method(myBoolean.toString());
这在编译期间给了我一个错误。但是当我添加以下额外的重载方法时,这再次起作用:
public void method(Boolean input) {
method(input);
}
我很困惑地发现,在这种情况下,调用method(myBoolean)
工作得很好。
为什么会这样?
答案 0 :(得分:3)
首先要理解的是原语没有方法。至少从截止日期开始,可能会随着Project Valhalla的实施而改变。为了能够在其上调用toString()
,您首先需要通过autoboxing或明确地将其包装起来。
给出方法public void takeString(String input) {}
:
takeString(true)
会失败,但takeString(""+true)
将起作用,因为它等同于takeString(""+Boolean.valueOf(true).toString())
,有效。takeString(Boolean.valueOf(true).toString())
也会有效,但请注意takeString(Boolean.valueOf(true))
将再次失败。可能奇怪的是,在情况(2)中,它能够应用autoboxing并隐式调用toString()
,而它无法为(1)执行此操作。
但是有充分的理由,如(2)的情况,编译器很清楚方法签名的参数类型为String
,因此它可以进行所需的隐式转换。对于(1),考虑到我们可以有多个takeString
的重载版本,这样做会很危险。它只是简化了编译器的工作,避免了以后添加重载版本时出现的问题。在(2)失败更安全。
示例,我们不希望逻辑突然改变,因为我们添加了以下方法:public void takeString(boolean input) {}
。
您可以考虑添加以下方法:
public void takeString(Boolean b) {
takeString(b.toString());
}
"仅限转换的意图"这里很清楚,并且会减少添加额外的非预期逻辑的机会。
在这种情况下,为本机boolean
参数提供重载版本也可能更明智,以避免随着API的发展而出现意外情况。
然后除了true.toString()
之外的所有案例都会有效。看起来像是要求在Java中实现转换的情况,就像我们在Scala中使用它们一样。这样可以避免大量过载样板。
答案 1 :(得分:1)
原始类型(例如boolean
)没有方法。这就是您尝试boolean.toString()时发生错误的原因。包装类比(Boolean.toString()
例如)。
现在对于该方法,如果您的方法是这样的:
public void method(String s)
然后你必须做出这样的另一种方法:
public void method(boolean b)
能够执行方法(布尔值)。如果没有方法(布尔b),你的编译器就会说method cannot be applied to boolean
或类似的东西。