Bienvenido a nuestra comunidad, en este sitio vas a encontrar la resolución a lo que estabas buscando.
Solución:
A Double
es NUNCAequals
a una Integer
. Además, un double
no es lo mismo que un Double
.
Java tiene tipos primitivos y tipos de referencia. Los tipos verdaderamente numéricos en Java no se extienden desde Number
porque son primitivos.
Es posible que desee considerar un sistema en el que no mezcle tipos, porque eso generalmente causará muchos problemas con conversiones implícitas/explícitas que pueden/no perder información, etc.
Preguntas relacionadas
En int
contra Integer
:
- ¿Cuál es la diferencia entre un int y un Integer en Java/C#?
- ¿Está Java totalmente orientado a objetos?
En Number
comparación:
- ¿Por qué no
java.lang.Number
implementarComparable
? - Comparando los valores de dos Números genéricos
Ver también
- Guía del lenguaje Java/Autoboxing
- JLS 4.2 4.2 Tipos y valores primitivos
los tipos numéricos son los tipos integrales y los tipos de coma flotante. Los tipos integrales son
byte
,short
,int
ylong
ychar
. Los tipos de punto flotante sonfloat
ydouble
.
En mixed-tipo de cálculo
El cálculo de tipo mixto es el tema de al menos 4 acertijos en Rompecabezas de Java.
Aquí hay varios extractos:
generalmente es mejor evitar mixedCálculos de tipo […] porque son inherentemente confusos […] En ninguna parte es esto más evidente que en las expresiones condicionales. Las comparaciones de tipos mixtos siempre son confusas porque el sistema se ve obligado a promover un operando para que coincida con el tipo del otro. La conversión es invisible y es posible que no produzca los resultados esperados.
Prescripción: Evite cálculos que mezclen tipos integrales y de coma flotante. Prefiere la aritmética integral al punto flotante.
Sé que es un tema viejo, pero… Para comparar dos Números en Java puedes usar el método compareTo de BigDecimal. BigDecimal puede contener todo, desde short hasta double o BigInteger, por lo que es la clase perfecta para esto.
Así que puedes intentar escribir algo como esto:
public int compareTo(Number n1, Number n2)
// ignoring null handling
BigDecimal b1 = new BigDecimal(n1.doubleValue());
BigDecimal b2 = new BigDecimal(n2.doubleValue());
return b1.compareTo(b2);
Seguramente este no es el mejor enfoque con respecto al rendimiento. Las siguientes pruebas funcionaron hasta ahora, al menos con JDK7:
assertTrue(compareTo(new Integer(1), new Integer(2)) == -1);
assertTrue(compareTo(new Integer(1), new Double(2.0)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MAX_VALUE)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MIN_VALUE)) == 1);
assertTrue(compareTo(new Integer(1), new Double(1.000001)) == -1);
assertTrue(compareTo(new Integer(1), new Double(1.000)) == 0);
assertTrue(compareTo(new Integer(1), new Double(0.25*4)) == 0);
assertTrue(compareTo(new Integer(1), new AtomicLong(1)) == 0);
El método específico que sugiere fallaría, porque está usando equals()
heredado de Object
. Es decir, comprobaría si el Number
objetos eran los mismos, no si sus valores somos lo mismo.
Si ese fue solo un ejemplo ilustrativo, actualizaré mi respuesta.
La respuesta de polygene en realidad cubre bastante el terreno al que me dirigía. También te puede interesar esta pregunta: ¿Por qué java.lang.Number no implementa Comparable?
Valoraciones y reseñas
Si guardas alguna sospecha o capacidad de perfeccionar nuestro artículo puedes ejecutar un paráfrasis y con mucho placer lo estudiaremos.