metodo - ¡El método de comparación viola su contrato general! Solo Java 7
implements comparable java (4)
Desafortunadamente, ninguna de las soluciones funciona para Android. TimSort se utiliza en profundidad en el ViewGroup de Android relacionado con addChildrenForAccessibility que se muestra en Java 7 y 8. Ningún código de usuario está involucrado en ninguna comparación.
De otros informes, está relacionado con tener RelativeLayout con elementos superpuestos como se hace comúnmente. Por ejemplo, un TextView que aparece sobre una Imagen, o dos elementos en la misma ubicación, donde solo establece uno visible a la vez. https://code.google.com/p/android/issues/detail?id=55933
No he encontrado ninguna forma de evitar el error. No puede establecer una opción -Djava en Android Studio o Eclipse (al menos eso podría encontrar). Forzar el uso de Java 1.6 debería funcionar, pero no es así. Parece que las nuevas tabletas y teléfonos Fire de Amazon son mucho más sensibles a este error que otros dispositivos.
Hay rumores de que Java 9 tendrá una solución, como una opción de tiempo de ejecución que funciona, pero con un error que ha existido durante años, tengo dudas de que alguna vez se solucione, especialmente teniendo en cuenta la animosidad entre Oracle y Google. Sí, quizás el error es muy profundo en el código de Android y debería arreglarse allí. Con más de mil millones de dispositivos, esa no es una solución viable para todos los dispositivos existentes.
Sé que esto ha sido un problema por un tiempo, y verifiqué todas las respuestas anteriores que pude obtener, pero todavía esta no funciona.
El objeto ''tripulación'' representa a los miembros de la tripulación con rangos y otros elementos. La comparación debe hacerse comparando ''assigned_rank'', un valor int, y si este valor es igual en ambas instancias, entonces ''is_trainer'', un booleano, debería marcar la diferencia.
Este método funcionó muy bien siempre y cuando se ejecutara con Java <7. Pero desde Java 7 sigo obteniendo este:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at dormas_flightlog.Query.getCrew(Query.java:714)
Aquí está la fuente, donde algunas partes potencialmente peligrosas ya han sido comentadas, pero todavía no funciona:
public class crew implements Serializable, Comparable<crew> {
private static final long serialVersionUID = 36L;
private int flightID = 0;
private int assigned_rank = 25;
private boolean is_trainer = false;
...
@Override
public int compareTo(crew him) {
int myRank = this.getAssigned_rank();
int hisRank = him.assigned_rank;
if (this == him) {
return 0;
}
if (myRank > hisRank) {
return 1;
}
if (myRank < hisRank) {
return -1;
}
if (myRank == hisRank) {
// if (is_trainer && !o.is_trainer) {
// i = 1;
// }
// if (!is_trainer && o.is_trainer) {
// i = -1;
// }
// if (is_trainer && o.is_trainer) {
// i = 0;
// }
// if (!is_trainer && !o.is_trainer) {
// i = 0;
// }
return 0;
}
return 0;
}
@Override
public int hashCode() {
int hash = 7;
hash = 31 * hash + this.assigned_rank;
hash = 31 * hash + (this.is_trainer ? 1 : 0);
return hash;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
int myRank = this.getAssigned_rank();
int hisRank = 0;
if (o instanceof crew) {
crew him = (crew) o;
hisRank = him.assigned_rank;
} else {
return false;
}
if (myRank > hisRank) {
return false;
}
if (myRank < hisRank) {
return false;
}
if (myRank == hisRank) {
// if (is_trainer && !o.is_trainer) {
// i = 1;
// }
// if (!is_trainer && o.is_trainer) {
// i = -1;
// }
// if (is_trainer && o.is_trainer) {
// i = 0;
// }
// if (!is_trainer && !o.is_trainer) {
// i = 0;
// }
return true;
}
return false;
}
}
Implementar equals () fue solo un intento de resolver este problema. La excepción dada viene con o sin igual (). No veo cómo el método compareTo infringe su contrato. Cualquier ayuda es muy apreciada ... un día este código tiene que funcionar con Java 7 y no sé cómo ... Gracias
Pude resolver este error porque era un error en jdk7.
aquí encontré la solución:
"¡El método de comparación viola su contrato general!" - TimSort y GridLayout
Básicamente solo tuve que agregar el
JAVA_OPTS="$JAVA_OPTS -Djava.util.Arrays.useLegacyMergeSort=true"
a mi jboss
mira esto:
De http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
Área: API: Utilidades Sinopsis: El comportamiento de ordenación actualizado para matrices y colecciones puede arrojar una excepción IllegalArgumentException
Descripción: el algoritmo de clasificación utilizado por java.util.Arrays.sort y (indirectamente) por java.util.Collections.sort se ha reemplazado. La nueva implementación de clasificación puede arrojar una IllegalArgumentException si detecta un Comparable que viola el contrato Comparable. La implementación anterior ignoró silenciosamente tal situación. Si se desea el comportamiento anterior, puede usar la nueva propiedad del sistema java.util.Arrays.useLegacyMergeSort, para restablecer el comportamiento de mergesort anterior.
Naturaleza de la incompatibilidad: comportamiento
RFE: 6804124
Para obtener información más detallada, consulte la referencia de la base de datos de errores aquí .
tal vez solo tengas valores NaN
que comparas a través de Collections.sort(...)
, esto ha sido un problema para mí y obtuve esa excepción incluso teniendo la implementación correcta del método compare(obj1, obj2)
! ¡Mira esto!