java autoboxing

java - ¿Es posible el autoboxing para las clases que creo?



(4)

¿Hay alguna manera de usar el autoboxing para las clases que creo? Por ejemplo, tengo esta subclase de 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"); } }

Ahora, UnsignedInteger i = new UnsignedInteger(88); funciona perfectamente bien, pero hay alguna forma de hacer esta compilación: UnsignedInteger i = 88; ? No lo hará por mí. ¡Gracias por adelantado!


En resumen, no. No hay forma de compilar eso.

Java solo define un conjunto limitado de conversiones de boxeo predefinidas.

Desde el JLS, sección 5.1.7 :

La conversión de boxeo convierte expresiones de tipo primitivo en expresiones correspondientes de tipo de referencia. Específicamente, las siguientes nueve conversiones se denominan conversiones de boxeo:

  • Del tipo booleano al tipo booleano.

  • De tipo byte a tipo Byte

  • Del tipo short al tipo Short

  • Del tipo char al tipo Character

  • Del tipo int al tipo entero

  • De tipo largo a tipo largo

  • Del tipo float al tipo float

  • De tipo doble a tipo doble

  • Del tipo nulo al tipo nulo

Además, se podría pensar en sobrecargar el operador = para realizar esta conversión, pero la sobrecarga del operador no es compatible con Java, a diferencia de C ++, donde esto sería posible.

Entonces tu conversión no es posible en Java.


En resumen: No, no es posible. Para que esto funcione, necesita una sobrecarga del operador, que no está disponible en Java. Ver link .



Si usa Groovy, puede establecer el comportamiento booleano implementando el método asBoolean: http://groovy-lang.org/semantics.html#_customizing_the_truth_with_asboolean_methods

Ejemplo:

class Color { String name boolean asBoolean(){ name == ''green'' ? true : false } } assert new Color(name: ''green'') assert !new Color(name: ''red'')

Sé que esto no es Java simple sino que se compila a bytecode y se ejecuta en la JVM.