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 .
No Desafortunadamente. Las conversiones automáticas de boxeo (según JLS §5.1.7 ) solo se definen para las clases primitivas estándar de envoltorios .
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.