int不会覆盖Java中的Integer

我有一个带有方法签名的Java函数

public void myMethod (int someInt, String someString) 

在我的抽象类中,我用方法覆盖了它

 public void myMethod (Integer someInt, String someString) 

过度骑行不起作用。 这是不一致的吗? 我认为自动装箱也适用于方法签名覆盖。

intInteger是两种不同的类型。 为了方便程序员,Autoboxing在源代码级别模糊了这种区别,但并没有改变它们实际上是两种非常不同类型的事实。

因此,你不能@Override一个带有一个带有Integerint的方法,反之亦然。

请注意,在声明采用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将被调用。

覆盖不起作用的原因是因为Integerint是两个不同的东西。 Integer是一个对象,而int是一个基本类型。 Java为您进行隐式类型转换。 例如:

int myInteger = new Integer(5);

将创建一个名为myInteger的原始int类型,其值为5.正如Javadoc所说,

Integer类在对象中包装了基本类型int的值。”

您是正确的,因为Java提供了自动装箱的function,因此在运行时JVM无法决定调用哪个方法,因为它可以调用两个方法,因为两种方法都适合参数类型。 所以我认为它会给出错误或随机选择任何一种方法…..只需运行它,看看…..

int和Integer是JAVA中的两种不同类型。虽然autoboxing指定了源代码级别的区别,但并没有改变它们实际上是两种截然不同的类型的永恒事实。