我在Java中使用方法签名
public void myMethod (int someInt, String someString)
在我的抽象类中,我用方法
覆盖了它public void myMethod (Integer someInt, String someString)
过度骑行不起作用。这是不一致吗?我认为自动装箱也适用于方法签名覆盖。
答案 0 :(得分:14)
int
和Integer
是两种不同的类型。为了方便程序员,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)
覆盖不起作用的原因是因为Integer
和int
是两个不同的东西。 Integer
是一个对象,而int
是一个基本类型。 Java为您进行隐式类型转换。例如:
int myInteger = new Integer(5);
将创建一个名为myInteger
的原始int类型,其值为5.正如Javadoc所说,
“
Integer
类包含值 一个原始类型int
对象“。
答案 4 :(得分:0)
这是正确的,因为Java提供了自动装箱的功能,因此在运行时,JVM无法决定调用哪个方法,因为它可以调用这两个方法,因为两种方法都适合参数类型。所以我认为它会给出一个错误或随机选择任何一种方法.....只需运行它并看到.....
答案 5 :(得分:0)
int和Integer是JAVA中的两种不同类型。虽然autoboxing指定了源代码级别的区别,但并没有改变它们实际上是两种截然不同的类型的永恒事实。