2012-05-06 36 views
6

He visto ejemplos en el sitio que tratan genéricos con múltiples parámetros pero ninguno que funcione para mi situación.Genéricos de Java con múltiples parámetros

Así que este es el trato: estoy tratando de aprender genéricos de Java y he decidido crear una función de utilidad de búsqueda de matriz binaria simple. Lo estoy probando usando objetos personalizados y enteros. Para obtener comentarios sobre errores y advertencias, estoy usando Eclipse. Esto es lo que tengo:

public static int binarySearch(Comparable[] array, Comparable item, int start, int end) { 
    if(end < start) { 
     return -1; 
    } 
    int mid = (start + end)/2; 
    if(item.compareTo(array[mid]) > 0) { 
     return binarySearch(array, item, mid + 1, end); 
    } else if(item.compareTo(array[mid]) < 0) { 
     return binarySearch(array, item, start, mid - 1); 
    } else { 
     return mid; 
    } 
} 

Obviamente recibo las advertencias para los tipos Raw diciendo que los genéricos deberían estar parametrizados. ¿Cómo puedo hacer esto correctamente dado que tengo múltiples parámetros que ambos deben ser del mismo tipo?

SOLUCIÓN

Aquí está la solución de trabajo utilizando los genéricos con las comprobaciones de parámetros correctos:

public static <T extends Comparable<? super T>> int binarySearch(T[] array, T item, int start, int end) { 
    if(array.length == 0) { 
     return -1; 
    } 
    if(item == null) { 
     return -1; 
    } 
    if(start < 0) { 
     return -1; 
    } 
    if(end < start) { 
     return -1; 
    } 
    int mid = (start + end)/2; 
    if(item.compareTo(array[mid]) > 0) { 
     return binarySearch(array, item, mid + 1, end); 
    } else if(item.compareTo(array[mid]) < 0) { 
     return binarySearch(array, item, start, mid - 1); 
    } else { 
     return mid; 
    } 
} 
+0

Sólo quiero hacerles saber, esto producirá un error si se pasa en una longitud cero o matriz nula. –

+0

Sí, es un ejemplo trivial: me interesa el concepto de múltiples genéricos, no la búsqueda binaria. Gracias sin embargo. – jjNford

Respuesta

9

puede especificar parámetro genérico-función específica como tal

public static <T extends Comparable<? super T>> int binarySearch(T[] arr,T elem,int start,int end){ 
    //... 
} 
+0

¿Qué hace el para esto? Simplemente curioso es todo, lo veo a menudo pero nunca con una explicación. – jjNford

+1

es un tipo extra de seguridad y permite más flexibilidad para que pueda pasar una matriz de algo cuya superclase implementa Comparable –

+4

@ratchetfreak No exactamente ... Se está diciendo que 'T' puede ser un tipo de cosas que son comparables a alguna superclase de 'T', mientras obliga a' arr' y 'elm' a seguir siendo una matriz y un elemento del mismo tipo. – trutheality

5

Ésta es la manera típica para crear funciones genéricas:

public static <T extends Comparable<? super T>> int binarySearch(T[] array, T item, int start, int end) { ... } 

Para supletoria generalidad, item no tiene ser del mismo tipo de las cosas en la matriz son, y las cosas en la matriz no tienen ser Comparable ya que no está comparándolos con nada, así

public static <T> int binarySearch(T[] array, Comparable<T> item, int start, int end) { ... } 

da cierta flexibilidad adicional.

+0

¡agradable! Me preguntaba eso también. para el contexto, creo que un enfoque más estricto sería mejor, pero es genial saberlo. Gracias. – jjNford

+0

buena respuesta, pero al ritmo del golpe, voy a def 1 respuesta, gracias un montón. – jjNford

Cuestiones relacionadas