【问题标题】:byte or Byte, please explain字节或字节,请解释
【发布时间】:2016-07-02 04:19:33
【问题描述】:

我在 JAVA 中创建一个新的Byte 对象并使用Byte 构造一个String,它给出了一个错误...

Byte B1 = new Byte((byte)41);
String S1 = new String(B1);

但是,当我使用 byte 而不是 Byte 时没有问题

byte d[]= {65,48};
String s1 = new String(d);

有什么区别?

【问题讨论】:

  • 至于OP的问题,这里最大的区别是一个sn-p有一个数组,一个没有。
  • 参考我对类似问题的回答stackoverflow.com/questions/38036726/…
  • 无论哪种情况,您都没有传递byte 参数。

标签: java byte


【解决方案1】:

不同之处在于new String(byte[]) 情况下有合适的构造函数重载,而new String(Byte) 情况下则没有。

这是为什么呢?

  • 因为它就是这样设计的。
  • 因为构造函数的设计目的。
  • 因为 Java 设计人员认为,一般来说,用构造函数和方法重载来处理那些很少会被使用的变体的 API 是个坏主意。

您应该如何了解更多信息?例如,一个类型有哪些构造函数?他们做什么/意味着什么?

  • 通过阅读 javadocs!

顺便说一下,自动拆箱/加宽与此示例无关。没有 String(byte)String(Byte) ... 或 String(Object) 构造函数。再多的拆箱或扩展都无法使这个示例发挥作用。

为了说明new String(...) 不适用于byte ...

public class Test {
    String s = new String((byte) 42);
}
$ javac Test.java 
Test.java:2: error: no suitable constructor found for String(byte)
    String s = new String((byte) 42);
               ^
    constructor String.String(String) is not applicable
      (argument mismatch; byte cannot be converted to String)
    constructor String.String(char[]) is not applicable
      (argument mismatch; byte cannot be converted to char[])
    constructor String.String(byte[]) is not applicable                                                                                                       
      (argument mismatch; byte cannot be converted to byte[])                                                                                                 
    constructor String.String(StringBuffer) is not applicable                                                                                                 
      (argument mismatch; byte cannot be converted to StringBuffer)                                                                                           
    constructor String.String(StringBuilder) is not applicable                                                                                                
      (argument mismatch; byte cannot be converted to StringBuilder)                                                                                          
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output                                                                   
1 error                                                                       
$   

【讨论】:

  • @glee8e - 实际上,它确实解释了一些事情......比对(坏)问题的简单回答更普遍,并且在更深的层面上。如果读者阅读(并理解)此答案,他们将知道如何回答他们的原始问题以及一整类其他问题。
  • 自动拆箱/加宽与此示例无关。没有 String(byte)String(Byte) ... 或 String(Object) 构造函数。
  • 好吧,我的错。我曾经认为有一些构造函数将 int 作为参数...我将 String 与具有 int 构造函数的 StringBuilder 混淆了。很抱歉。
【解决方案2】:

嗯,最大的区别在于,在一种情况下,您使用的是数组,而在另一种情况下,您没有。

但是,值得指出的是,即使您在两种情况下都使用了数组,也会有所不同。那就是:

Byte[] d1 = {65,48};         // legal
byte[] d2 = {65,48};         // legal
String s1 = new String(d1);  // illegal
String s2 = new String(d2);  // legal

(注意:最好说Byte[] d1而不是Byte d1[];两者是等价的,但第一个明确Byte[]是变量的类型,而第二个是包含在Java中的仅作为对习惯以这种方式编写东西的 C 程序员的让步。)

这里的重点是 Java 将自动装箱和自动拆箱 Bytebyte。也就是说,如果您有一个Byte 变量并为其分配一个byte,它将自动转换,反之亦然。但是,这种自动装箱和自动拆箱不适用于数组——Java 不会Byte[]byte[] 之间自动转换。

不幸的是,除了使用具有toObjecttoPrimitive 数组转换的 Apache Commons 之外,我没有看到在这两种数组类型之间进行转换的简单方法(请参阅here)。

【讨论】:

    【解决方案3】:

    这是因为自动装箱和拆箱的工作方式。在这里您可以获取更多信息:http://beginnersbook.com/2014/09/java-autoboxing-and-unboxing-with-examples/

    【讨论】:

    • 不正确。自动装箱和拆箱与此示例无关。 (提示:没有String(byte) 构造函数。真的。阅读javadocs!)
    • IMO,这里不足以保证答案。这很容易成为评论,因为它完全由链接支持。请提供该链接中信息的要点;它可能会死,然后这肯定一文不值。
    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多