我正在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);
有什么区别?
区别在于new String(byte[])
有一个合适的构造函数重载,而new String(Byte)
没有。
为什么?
- 因为这是设计的方式。
- 因为构造函数的设计目的。
- 因为Java设计者认为通常来说,用构造函数和方法重载来处理很少使用的变量是一个坏主意。
你应该如何发现更多?例如,类型有哪些构造函数?他们是什么意思?
- 通过阅读javadoc !
顺便说一下,自动拆箱/加宽与这个例子无关。没有
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
$
最大的区别是,在一种情况下,你使用的是数组,而在另一种情况下,你不是。
然而,值得指出的是,即使在这两种情况下都使用数组,也会有区别。即: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将自动装箱和自动装箱Byte
和byte
。也就是说,如果您有一个Byte
变量并为它分配了一个byte
,它将自动转换,反之亦然。然而,这种自动装箱和自动装箱并不适用于数组——Java 不会在之间自动转换Byte[]
和byte[]
。
不幸的是,我没有看到一个简单的方法来转换两种数组类型,除了使用Apache Commons有toObject
和toPrimitive
数组转换(见这里)。
这是因为自动装箱和拆箱的工作方式。您可以在这里获得更多信息:http://beginnersbook.com/2014/09/java-autoboxing-and-unboxing-with-examples/