2010-01-15 23 views
13

Supongamos que escribe una función estática en Java para ordenar una matriz, al igual que Arrays.sort(). El problema con Arrays.sort() es que recibe una matriz de Objeto y arroja un ClassCastException si sus elementos no implementan Comparable.Genéricos y clasificación en Java

Así que desea que su función reciba como argumento una matriz de un subtipo de Comparable. Algo así podría funcionar:

static <T extends Comparable> void sort(T[] array); 

El problema con el que la firma es que todavía puede pasar una matriz de comparables con enteros y cadenas, por ejemplo, lo que causaría un RuntimeException.

Así que, ¿cómo se puede crear una función que va a recibir solamente una matriz cuyos elementos implementar Comparable y tienen todos del mismo tipo (por ejemplo, entero, cadena, etc?)

+0

Otro problema con la firma es que está utilizando un tipo sin procesar en un límite genérico. –

Respuesta

23

Uso

static <T extends Comparable<? super T>> sort(T[] array); 

cuales es la especificación más general para realizar la tarea. Básicamente, afirma que T es un tipo que se puede comparar a sí mismo.

+0

Aaah ... finalmente un uso válido de 'super' .. :) – falstro

+4

+1. Esa es la misma firma que usa Collections.sort. – Thilo

13

respuesta de Dirk es el mejor que se puede conseguir, pero Google Colecciones utiliza exactamente como usted escribió para evitar error en javac:

¿Por qué se utiliza el tipo <E extends Comparable> en varias API, que no es "totalmente generificado "? ¿No debería ser <E extends Comparable<?>>, <E extends Comparable<E>> o <E extends Comparable<? super E>>?

La última sugerencia es la correcta, como se explica en Efectivo Java. Sin embargo, utilizaremos <E extends Comparable<E>> en métodos sin parámetros para evitar un error javac horrible. Esto le causará problemas cuando use un tipo muy inusual como java.sql.Timestamp que es comparable a un supertipo. (necesita más explicación.)

Desde: http://code.google.com/p/google-collections/wiki/Faq

Ahora le toca a usted ...

+1

El formato de Wiki comió sus soportes puntiagudos ... – Thilo

+0

yuppy, ahora uso el código para ello :( – nanda

2

En el mundo Java post-1,5, matrices de referencia son sólo detalles de implementación de bajo nivel. Prefiere, colecciones.

Si está interesado en las matrices de referencia, por alguna razón peculiar, sabrá que realmente no se llevan bien con los genéricos. No puede (razonablemente) tener una matriz de un tipo genérico, como Comparable<String>. Eso significa que si Arrays.sort se generizó de manera similar a Collections.sort, estaría sobrecargado.

Debido a la peculiaridad de la matriz de escribir, si se quería tipos sobrelimita, creosort se puede escribir más simple que Collections.sort sin sacrificar nada significativo.

public static <T extends Comparable<T>> sort(T[] array) 

Si desea compatibilidad binaria con pre-genéricos, entonces necesitará un ligero truco para volver a la firma Object[], de una manera similar a los gustos de Collections.min.

public static <T extends Object & Comparable<T>> sort(T[] array)