我创建的类可以进行自动装箱吗?

时间:2013-07-12 16:35:25

标签: java autoboxing

有没有办法为我创建的类使用自动装箱?例如,我有Number的这个子类。

public class UnsignedInteger extends Number {
    int n;

    public UnsignedInteger(int n) {
        if(n >= 0)
            this.n = n;
        else
            throw new IllegalArgumentException("Only positive integers are supported");
    }
}

现在,UnsignedInteger i = new UnsignedInteger(88);工作正常,但有没有办法进行编译:{{1​​}}?它不适合我。提前谢谢!

4 个答案:

答案 0 :(得分:19)

简而言之,没有。没有办法让它编译。<​​/ p>

Java仅定义了一组有限的预定义装箱转换。

来自JLS, section 5.1.7

  

拳击转换将基本类型的表达式转换为引用类型的相应表达式。具体来说,以下九个转换称为装箱转换:

     
      
  • 从类型布尔值到类型布尔

  •   
  • 从类型字节到类型字节

  •   
  • 从短类型到短类型

  •   
  • 从char类型到Character

  •   
  • 从int类型到Integer类型

  •   
  • 从long类型到Long

  •   
  • 从float类型到Float类型

  •   
  • 从类型double到类型Double

  •   
  • 从null类型到null类型

  •   

此外,有人可能会考虑重载=运算符来执行此转换,但Java中不支持运算符重载,这与C ++不同,这可能是可行的。

因此,您无法在Java中进行转换。

答案 1 :(得分:12)

不,不幸的是。 Automatic boxing conversions(根据JLS §5.1.7)仅为标准primitive wrapper classes定义。

答案 2 :(得分:2)

简而言之:不,这是不可能的。为此,您需要运算符重载,这在Java中是不可用的。请参阅link

答案 3 :(得分:0)

如果使用Groovy,可以通过实现asBoolean方法设置布尔行为:http://groovy-lang.org/semantics.html#_customizing_the_truth_with_asboolean_methods

示例:

class Color {
    String name

    boolean asBoolean(){
        name == 'green' ? true : false
    }
}

assert new Color(name: 'green')
assert !new Color(name: 'red')

我知道这不是普通的Java,而是编译为字节码并在JVM上运行。