Tag: 拆箱

取消装箱空盒装对象会引发意外的NullPointerException

如果您运行以下代码, public class Foo{ public static void main(String[] args){ int id = new Bar().getId(); // throws unexpected NullPointerException } private static class Bar{ private final Integer id; public Bar(){ this(null); } public Bar(Integer id){ this.id = id; } public Integer getId(){ return id; } } } 你会得到以下堆栈跟踪, Exception in thread “main” java.lang.NullPointerException at Foo.main(Foo.java:3) 为什么没有编译器警告或任何东西? […]

为什么有些语言需要拳击和拆箱?

这不是什么是装箱和拆箱的问题,而是为什么像Java和C#这样的语言需要呢? 我非常熟悉C ++,STL和Boost。 在C ++中,我可以很容易地写出这样的东西, std::vector dummy; 我有一些Java经验,但我真的很惊讶,因为我必须写这样的东西, ArrayList dummy = new ArrayList(); 我的问题,为什么它应该是一个对象,在谈论generics时,在技术上如此难以包含原始类型?

整数自动拆箱和自动装箱会产生性能问题吗?

我们目前正在使用x++;进行一些迭代和其他操作x++; 其中x是Integer而不是int 。 在我们的系统上的一些用户操作中可以重复操作,但没有像数学应用程序那样复杂或众多,每个用户事务最多可达10000次。 这种拆箱和后来的装箱是否会影响我们的性能一些明显的毫秒 ?

在Java中,如果返回类型分别是基元及其包装类,是否可以重写方法?

在使用Java中重写和重写方法的想法时,我注意到这些方法的返回类型有一些灵活性。 这里有一点理论:“派生类中重写方法的返回类型可以是相同的,或者是基类中重写方法的返回类型的子类。这种重写方法的返回类型是已知的作为协变回归类型。“ 下面的例子假设B扩展A. Method in A: public Object some_method() {….} Method in B: public Integer some_method() {….} 因此,我们看到B中的some_method()会覆盖A中的some_method(),因为Integer是Object的子类。 我想知道是否存在以下灵活性以及以下是否因为自动装箱和拆箱而正确工作: Method in A: public Integer some_method() {….} Method in B: public int some_method() {….} 要么 Method in A: public int some_method() {….} Method in B: public Integer some_method() {….}

拆箱问题

我有一个扩展LinkedList类的类。 这是代码的摘录: class SortedList extends LinkedList { int intMethod(Integer integerObject){ return integerObject; } } 这应该返回自动取消装箱的int值。 但由于某种原因,编译器抛出一个错误,指出类型不兼容,并且所需类型为int,找到的类型为Integer。 这在另一个class级完美无缺! 是什么赋予了? 🙁

等于运算符如何处理原始和对象类型数据

我知道这是一个非常基本的问题,但我想明确这个概念。 我想知道在原始和对象类型的情况下==运算符如何工作。 例如 Integer a = 1; int b = 1; System.out.println(a == b) 如何将a与b进行比较,而a包含包含值1的对象的引用。有人可以向我清楚它是如何在内部工作的吗?

在性能,隐式(自动)拆箱或显式拆箱方面哪个更好?

把它放在代码中 – 性能更好(如果有差异的话)? 鉴于这种: public class Customer { …. public Boolean isVIP(){…} … } 哪个更快? public void handleCustomer(Customer customer) { if (customer.isVIP()) // Auto Unboxing { handleNow(customer); } else { sayHandlingNowButQueueForTomorrow(customer); } } 或这个: public void handleCustomer(Customer customer) { if (customer.isVIP().booleanValue()) // Explicit unboxing { handleNow(customer); } else { sayHandlingNowButQueueForTomorrow(customer); } }

整数包装类和==运算符 – 指定的行为在哪里?

Integer integer1 = 127; Integer integer2 = 127; System.out.println(integer1 == integer2);//true integer1 = 128; integer2 = 128; System.out.println(integer1 == integer2);//false 我发现它返回==(如果是)在-128 – 127的范围内,为什么有这样的规范?

java中的方法重载解析

以下是我对java中重载解析的了解: 编译器尝试从给定的重载方法定义解析方法调用的过程称为重载解析。 如果编译器找不到完全匹配,则仅通过使用upcasts来查找最接近的匹配(从不进行向下转换)。 这是一堂课: public class MyTest { public static void main(String[] args) { MyTest test = new MyTest(); Integer i = 9; test.TestOverLoad(i); } void TestOverLoad(int a){ System.out.println(8); } void TestOverLoad(Object a){ System.out.println(10); } } 正如预期的那样,输出为10。 但是,如果我稍微更改类定义并更改第二个重载方法。 public class MyTest { public static void main(String[] args) { MyTest test = new MyTest(); Integer i […]

java自动装箱/拆箱如何工作?

从JDK 5.0开始,在java中引入了自动装箱/拆箱function,这个技巧简单而有用,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑,例如自动装箱的概念在java中是如何工作的,例如: 拳击 int intValue = 0; Integer intObject = intValue; byte byteValue = 0; intObject = byteValue; // ==> Error 在尝试不同的情况( short , long , float , double )之后,编译器接受的唯一情况是当effectation运算符右边的值的类型为int 。 当我查看Integer.class的源代码时,我发现它只实现了一个带有int参数的构造函数。 所以我的结论是自动装箱的概念是基于包装类中实现的构造函数。 我想知道这个结论是否属实,还是有自动拳击使用的另一个概念? 拆箱 Integer intObject = new Integer(0); byte byteValue = intObject; // ==> Error (the same Error with short) int intValue = […]