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)中相同
  • 在案例(2)中,它能够应用并隐式调用
    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)中相同
  • 在案例(2)中,它能够应用并隐式调用
    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中实现转换一样。这将避免大量重载样板文件。

    什么错误?共享您的代码……听起来您使用的是
    布尔值
    ,这是数据类型