int不会覆盖Java中的Integer

时间:2010-08-02 08:09:59

标签: java

我在Java中使用方法签名

public void myMethod (int someInt, String someString) 

在我的抽象类中,我用方法

覆盖了它
public void myMethod (Integer someInt, String someString)

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

6 个答案:

答案 0 :(得分:14)

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

因此,你不能@Override一个方法,int采用Integer,反之亦然。

请注意,在声明采用Integer而不是int的方法之前,您应该三思而后行。以下摘录自 Effective Java 2nd Edition,Item 49:Prefer primitives to boxed primitives

  

总之,只要有选择,就可以优先使用原始元素。原始类型更简单,更快捷。如果你必须使用盒装基元,小心!自动装箱减少了使用盒装基元的冗长,但没有降低危险。当您的程序将两个盒装基元与==运算符进行比较时,它会进行身份比较,这几乎肯定不是您想要的。当您的程序执行涉及盒装和未装箱原语的混合类型计算时,它会进行拆箱,当您的程序取消装箱时,它可以抛出NullPointerException。最后,当您的程序框原始值时,它可能导致代价高昂且不必要的对象创建。

有些地方你别无选择,只能使用盒装基元,例如:泛型,但除此之外你应该认真考虑是否有合理使用盒装基元的决定。

另见

相关问题

答案 1 :(得分:4)

不,这两个签名定义了两种不同的方法。

答案 2 :(得分:2)

由于参数不同,它们绝对不会被覆盖但会超载。 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。

答案 3 :(得分:1)

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

int myInteger = new Integer(5);

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

  

Integer类包含值   一个原始类型int   对象“。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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