为什么布尔值在某些情况下可以转换为字符串,而在其他情况下不是?

时间:2015-06-30 02:27:52

标签: java string boolean

我使用了一个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)工作得很好。

为什么会这样?

2 个答案:

答案 0 :(得分:3)

首先要理解的是原语没有方法。至少从截止日期开始,可能会随着Project Valhalla的实施而改变。为了能够在其上调用toString(),您首先需要通过autoboxing或明确地将其包装起来。

给出方法public void takeString(String input) {}

  1. takeString(true)会失败,但
  2. takeString(""+true)将起作用,因为它等同于
  3. takeString(""+Boolean.valueOf(true).toString()),有效。
  4. takeString(Boolean.valueOf(true).toString())也会有效,但请注意
  5. 由于与(1)中的原因相同,
  6. takeString(Boolean.valueOf(true))将再次失败。
  7. 可能奇怪的是,在情况(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或类似的东西。