当前位置: 首页 > 知识库问答 >
问题:

匹配方法签名的自动装箱和基元类型

令狐翰
2023-03-14

在版本1.5中,Java引入了自动装箱的概念。

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) {

    }
}

那么为什么我在覆盖未实现的方法时出现编译时错误,为什么上面的测试方法的参数没有自动装箱以匹配父测试方法签名?

共有3个答案

徐瀚
2023-03-14

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

阅读更多:http://javarevisited.blogspot.com/2012/07/auto-boxing-and-unboxing-in-java-be.html#ixzz36Rhg91CB.

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

蒙经纶
2023-03-14

因为整数不等于 int

  • 整数是类
  • int 是基元类型

所以这两个方法都有不同的参数类型,这就是为什么您不覆盖该方法,而是在类中创建新的方法。

您可以调用具有自动装箱功能的方法,但您不能ovveride。

最重要的

子类中具有相同签名(名称,加上参数的数量和类型)和返回类型的实例方法....< br >

当原始值为以下值时,Java编译器会应用自动装箱:

  • 作为参数传递给需要相应包装类的对象的方法。
  • 分配给相应包装类的变量。
须彭亮
2023-03-14

这是因为子类中的方法与超类中的方法不具有覆盖等效性。超类方法可以将null作为参数,而子类方法不能(这里没有关于自动装箱的内容)。

 类似资料:
  • 问题内容: 我想将原语转换为字符串,然后尝试: 失败并显示以下错误: 现在,我知道原语不是引用类型(即不是对象),因此不能有方法。但是,Java 5引入了自动装箱和拆箱功能(一种C#…我在C#中从未喜欢过,但这不重要)。因此,通过自动装箱,我希望上面将myInt转换为Integer,然后在其上调用toString()。 此外,我相信C#允许这样的调用,除非我记错了。这仅仅是Java的自动装箱/拆箱

  • 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护了到之间的值的内部缓存(另请参阅TheLostMind的注释)。这就是为什么我在示例中使用的原因,也是为什么我特别询问取消装箱/装箱而不是比较结果的原因。

  • 本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double 

  • 有以下代码: 它打印: 12 这个不能编译。为什么?

  • 问题内容: 以下代码进行编译(使用Java 8): 但是它是做什么的呢? 取消装箱: 或盒子: 那么它是比较两个对象(按引用)还是按值比较两个变量? 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类会维护一个介于to 之间的值的内部缓存(另请参见TheLostMind的注释)。这就是我在示例中使用的原因,也是为什么我特别询问拆箱/装箱而不是比较结果的原因。 问题答案: 它在JL

  • 问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使