自动装箱和原始类型以匹配方法签名

时间:2014-07-03 09:17:48

标签: java autoboxing

在版本1.5中,Java引入了auto-boxing的概念。

public interface SomeInterface {
    public void test(Integer val);
}

public class Main implements SomeInterface {

    /*The method signature gets different and compiler is asking to override 
    un-implemented methods*/
    public void test(int t) {

    }
}

那么为什么我为了覆盖未实现的方法而得到编译时错误,为什么上面的测试方法的参数不是auto-boxed来匹配父测试方法签名?

5 个答案:

答案 0 :(得分:6)

这是因为子类is not override-equivalent中的方法与超类中的方法有关。超类方法可以将null作为参数,而子类方法可以(这里没有关于自动装箱的内容)。

答案 1 :(得分:1)

因为Integer Not Equal to int

  • Integer是班级
  • int是原始类型

因此,这两种方法都有不同的参数类型,这就是为什么你没有覆盖方法而是在你的类中创建更新的方法。

您可以使用自动装箱功能调用方法,但不能再使用。

  

<强> Overriding

     

子类中具有相同签名的实例方法(name,plus   数字和 TYPE 的参数)并返回类型....


  

The Java compiler applies autoboxing when a primitive value is:

     
      
  • 作为参数传递给期望相应包装类的对象的方法。
  •   
  • 分配给相应包装类的变量。
  •   

答案 2 :(得分:0)

自动装箱和取消装箱可以发生在需要对象和原始类型可用的任何地方。例如在需要对象参数的方法调用中,如果传递原语,Java会自动将原语转换为相等的值。

了解详情:http://javarevisited.blogspot.com/2012/07/auto-boxing-and-unboxing-in-java-be.html#ixzz36Rhg91CB

这里你的类Main实现接口SomeInterface,这是方法的实现,而不是调用自动装箱工作的方法。

答案 3 :(得分:0)

这在概念上是不可能的,因为Java运行时不知道关于装箱的事情。拳击特征在Java 编译器级别上实现,类似于泛型。事实上,即使在当前的Java 8版本中,Java 运行时也不认为原始int和盒装Integer有任何共同点。

相反,无论何时进行如下任务:

Integer i = 42;

Java编译器 desugars 此表达式

Integer i = new Integer(42);

然后由Java运行时如上所述观察。同时,Java运行时考虑

void foo(int i);
void foo(Integer i);

是不同的方法,这就是为什么拳击在运行时级别难以实现以便向后兼容的原因。

答案 4 :(得分:0)

对此的简单回答是:

如果可以重载2个方法,则意味着编译器认为签名不同。

并且,对于重写方法,两个方法都应该具有相同的签名。

E.g。 :

//Method overloading, compiler doesn't complain, which means "signatures are different",
//because one is expecting an object of Integer Class, and other is expecting a primitive value.
class A{
  public void a(Integer a){...}
  public void b(int a){...}
}

//Method Overriding, compiler complains, because "signatures are different!"
class A{
  public void a(Integer a){...}
}
class B extends A{
    @Override
    public void a(int a){...}
}