int不会覆盖Java中的Integer
我有一个带有方法签名的Java函数
public void myMethod (int someInt, String someString)
在我的抽象类中,我用方法覆盖了它
public void myMethod (Integer someInt, String someString)
过度骑行不起作用。 这是不一致的吗? 我认为自动装箱也适用于方法签名覆盖。
int
和Integer
是两种不同的类型。 为了方便程序员,Autoboxing在源代码级别模糊了这种区别,但并没有改变它们实际上是两种非常不同类型的事实。
因此,你不能@Override
一个带有一个带有Integer
的int
的方法,反之亦然。
请注意,在声明采用Integer
而不是int
的方法之前,您应该三思而后行。 以下是Effective Java 2nd Edition的摘录,第49项:首选基元到盒装基元 :
总之,只要您有选择,就可以优先使用原始元素。 原始类型更简单,更快捷。 如果你必须使用盒装基元,小心! 自动装箱减少了使用盒装基元的冗长度,但没有降低危险性。 当你的程序将两个盒装基元与
==
运算符进行比较时,它会进行身份比较,这几乎肯定不是你想要的。 当您的程序执行涉及盒装和未装箱原语的混合类型计算时,它会进行拆箱,当您的程序进行拆箱时,它会抛出NullPointerException
。 最后,当您的程序框原始值时,它可能导致代价高昂且不必要的对象创建。
有些地方你别无选择,只能使用盒装基元,例如generics,但是你应该认真考虑使用盒装基元的决定是否合理。
也可以看看
- Java语言指南/ Autoboxing
相关问题
- Java / C#中的int和Integer有什么区别?
- 是否保证Java中的新Integer(i)== i? (是的!这个盒子是未装箱的,而不是其他方式!)
- 为什么
int num = Integer.getInteger("123")
抛出NullPointerException
? (!!!) - 为什么null == 0在Java中抛出NullPointerException?
不,这两个签名定义了两种不同的方法。
由于参数不同,它们绝对不会被覆盖,但会超载。 并且JVM将选择基于此方法启动的方法:widen – boxing – var args …
例如,您有三种方法
void add(long n) {} // call this method 1 void add(int... n) {} // call this method 2 void add(Integer n) {} // call this method 3
当你调用时:
int a = 5; add(a);
方法1将被调用。
覆盖不起作用的原因是因为Integer
和int
是两个不同的东西。 Integer
是一个对象,而int
是一个基本类型。 Java为您进行隐式类型转换。 例如:
int myInteger = new Integer(5);
将创建一个名为myInteger
的原始int类型,其值为5.正如Javadoc所说,
“
Integer
类在对象中包装了基本类型int
的值。”
您是正确的,因为Java提供了自动装箱的function,因此在运行时JVM无法决定调用哪个方法,因为它可以调用两个方法,因为两种方法都适合参数类型。 所以我认为它会给出错误或随机选择任何一种方法…..只需运行它,看看…..
int和Integer是JAVA中的两种不同类型。虽然autoboxing指定了源代码级别的区别,但并没有改变它们实际上是两种截然不同的类型的永恒事实。