¿Por qué funciona esta asignación de clase de Número (java)?

Busqué un duplicado de esto pero no veo una réplica lo suficientemente similar como para satisfacer.

No puede crear instancias de clases abstractas en Java, y Number es abstracto, entonces, ¿por qué se compila esta línea?

Number num = 3;

Si fuera Integer num, se autoboxearía, pero ¿funciona de alguna manera también el autoboxing para Number, aunque sea abstracto? ¿O está sucediendo algo más?

Respuesta 1

No es para lo que funciona el auto-boxeo Number. Tienes toda la razón, la Numberclase es abstracta y no se puede instanciar. Además, no existe un mecanismo general para auto-boxear un número primitivo en un Numberobjeto en Java.

Es que el auto-boxeo funciona de inta Integer. El literal 3es un int(sin excepción). Y Integeres una subclase concreta de Number, por lo que poner una referencia a Integeruna variable declarada como Numberlibre de problemas.

Puede ser un poco sorprendente que funcione, estoy de acuerdo contigo. La regla básica del auto-boxeo es que puedes poner un lugar intdonde Integerse espera, un lugar doubledonde Doublese espera, y así sucesivamente. Difícilmente podemos decir que Integerse esperaba necesariamente una en el lado derecho de su inicialización. Parece que han extendido la regla para que sea aplicable aquí de todos modos. Y no hay duda en el JLS en alguna parte (JLS: Java Language Specification).

Solo para verificar podemos hacer:

    Number num = 3;
    System.out.println(num.getClass());

Salida:

clase java.lang.Integer

Puede extender la regla un paso más allá:

    Object obj = 3;

Todavía te da un Integer(no solo un Objectaunque Objectsea ​​una clase concreta).

Enlace: Pregunta similar: ¿Java autobox cuando asigna un int a un objeto? (También encontrará las referencias a JLS allí)

Respuesta: 2

Estoy tratando de hacer que mi programa devuelva el valor después de ejecutar el último ciclo for, pero por alguna razón se repite varias veces después del ciclo for. Agregué un System.print justo antes ...

Lol, fallé por completo hace un momento. Subió el código después de eliminar algo. De todos modos, obtuve el fondo para cargar usando ImageIcons, pero estoy tratando de usar una BufferedImage porque así es como ...

Tengo un EC Point sin comprimir para la curva prime256v1, y estoy tratando de construir un objeto PublicKey a partir de él usando el código a continuación (referido desde aquí), usando el proveedor BouncyCastle: public static void ...

Copié el ejemplo de código que "ilustra cómo consultar los 5 defectos de mayor prioridad" que se encuentra en la parte inferior de la página Java Toolkit for Rally Rest. Cambié el nombre de usuario y la contraseña ...