在java中,我可以编写像这样的代码
Boolean b = true ;
它会起作用。我现在有一个保持值为“true”的对象。
这是如何工作的?为什么我不必通过构造函数传递值?像这样:
Boolean b = new Boolean( true ) ;
另外,我可以制作可以以类似方式实例化的自定义类吗?那么这叫什么呢?
所以我可以这样做:
Foobar foobar = "Test" ;
因此拥有我自己的包装类。
由于
答案 0 :(得分:13)
不,你不能做后者。
前者称为autoboxing,在Java v1.5中引入了自动换行,它们的包装器中包含原语。
使用泛型和/或集合时,可以清楚地看到自动装箱的好处:
在“原始类型的自动装箱和自动拆箱”示例中,我们有:
之前(添加了自动装箱)
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = (list.get(0)).intValue();
在
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, 42);
int total = list.get(0);
如您所见,代码更清晰。
请记住文档中的最后一个注释:
那么什么时候应该使用自动装箱和拆箱?仅在引用类型和基元之间存在“阻抗不匹配”时才使用它们,例如,当您必须将数值放入集合时。将自动装箱和拆箱用于科学计算或其他对性能敏感的数字代码是不合适的。 Integer不能替代int; autoboxing和unboxing模糊了原始类型和引用类型之间的区别,但它们并没有消除它。
答案 1 :(得分:3)
这是如何运作的?
这是一个编译器功能。编译器将自动生成装箱操作。它实际上做的是生成
Boolean.valueOf(true);
因为这样会使用现有的(不可变的)实例Boolean.TRUE和Boolean.FALSE,而不是创建一个新实例。
答案 2 :(得分:1)
这与您生成String对象的方式相同:
String s = "foobar"
这只是Java中的一个特权,真的。我不确定为什么你想要创建自己的包装类,考虑到任何原始数据类型已经有一个预定义的包装器......
答案 3 :(得分:1)
此功能已添加到Java 1.5中,名为Autoboxing。这种魔法只适用于原始值和相应的包装器。
你不能用Java自己做。如果你仍然想要它,那就去Scala - 这太好了!也就是说,您可以使用名为implicit conversions的功能。以下是您的案例的小例子:
case class Foobar(value: String)
implicit def convertStringToFoobar(s: String) = Foobar(s)
val foobar: Foobar = "Test";
答案 4 :(得分:0)
不,这只是编译魔术;它将这些视为特殊情况(称为 autoboxing )。参见例如http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
答案 5 :(得分:0)
它被称为autoboxing,基本上只是编译器为你做的事情。它仅在Java 5中添加,之前您必须使用new Boolean( true )
或(更好)Boolean.TRUE
。
不,你不能拥有自己的类,它只适用于原始的包装类。