【问题标题】:Is there any way to overload the Integer unboxing method in Java?有没有办法重载Java中的整数拆箱方法?
【发布时间】:2018-02-06 15:51:09
【问题描述】:

我正在尝试确定 Java 使用的拆箱方法是否可以修改。这样做的目的是为了能够做到:

class IInteger extends Integer {
  @Override
  public int unboxToPrimitive(){
    return ++val;
  }
}

IInteger i = 10;
System.out.print(i); // 11

也就是说,重载方法并让它返回 ++val 而不是 val。

【问题讨论】:

  • 无法扩展像 Integer 这样的最终类 - stackoverflow.com/questions/5181578/use-of-final-class-in-java
  • 我会对您尝试使用此覆盖解决的问题感兴趣吗?
  • @lwi 试图解决 return i<=1 && i>=1 && i!=1 等于真问题
  • @userunknown 即使您将Integer 类更改为非最终类型,您仍然无法装箱为自定义类型,因为the language only defines boxing between specific types
  • @lwi 这是他们在面试时有时会问的那些脑筋急转弯之一。例如,在 javascript 中,可以通过重载 valueOf 方法以返回 ++x 来完成,这样每次评估它时,它都会返回一个不同的值,从而能够使表达式返回 true。它在实际编程中没有用处。

标签: java integer overloading wrapper


【解决方案1】:

没有。这是不可能的,首先Integerfinal 并且不能被子分类。其次,您不能在 Java 中重载运算符。接下来,您不能对自定义类型进行自动装箱。最后,您实际上并没有在 println 中使用拆箱(您可以在引用类型上调用 print)。

但是,如果我了解您真正想要什么,您可以使用AtomicIntegerincrementAndGet()(而不是get(),并根据需要更改其他方法)。

【讨论】:

  • 感谢您的回复,相当全面。我试着找出当你 println 一个 Integer 时调用了什么方法,它只是 toString() 吗?
  • @Felix Object.toString,它在Integer 中被重载,请参见GrepCode 示例。
【解决方案2】:

不,您甚至不能扩展 java.lang.Integer,因为它是最后的课程。

【讨论】:

  • 谢谢。我看到我无法扩展 Integer 但希望可能存在某种漏洞。我不坚持使用 Integer 本身,只要我可以制作我的课程并像示例中那样使用它。
  • @Felix 你可以覆盖java.lang,Number 但是你不能取消它,因为它没有等效的原始类型JVM 可以转换为...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多