【问题标题】:int does not override Integer in Javaint 不会覆盖 Java 中的 Integer
【发布时间】:2010-08-02 17:39:33
【问题描述】:

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

public void myMethod (int someInt, String someString) 

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

public void myMethod (Integer someInt, String someString)

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

【问题讨论】:

标签: java


【解决方案1】:

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

因此,您不能 @Override 采用 int 的方法与采用 Integer 的方法,反之亦然。

请注意,在声明采用Integer 而不是int 的方法之前,您可能应该三思而后行。这是Effective Java 2nd Edition,Item 49: Prefer primitives to boxed primitives的节选

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

有些地方你别无选择,只能使用盒装图元,例如泛型,否则您应该认真考虑使用盒装原语的决定是否合理。

另见

相关问题

【讨论】:

  • +1:非常好的答案,不仅解决了这个问题,还解决了围绕它的其他许多问题。
  • @Donal:众所周知,我在某些答案上“偏离主题”太过分了,但我希望我能在这个问题上达到目标。我很想写关于如何为@Override 目的(JLS 8.4.2)指定子签名,但我设法阻止了......这次......
  • 我通常会避免预期的东西,除非它完全相关或提问者表现出一定的专业知识。这个问题,在它被问到的层面上,始终是我的焦点(除了在 cmets 中;我会在那里谈论无关紧要的垃圾。;-))
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    由于参数不同,它们绝对不是被覆盖而是重载。 JVM会根据这个选择启动方式: 扩大 - 拳击 - 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 将被调用。

    【讨论】:

      【解决方案4】:

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

      int myInteger = new Integer(5);

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

      "Integer 类包装了一个值 原始类型int 对象。”

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-08
            • 1970-01-01
            • 1970-01-01
            • 2020-11-30
            • 2014-07-19
            • 1970-01-01
            相关资源
            最近更新 更多