2012-05-06 3 views
6

Ho visto esempi sul sito che si occupano di generici con più parametri ma nessuno che funzioni per la mia situazione.Generici Java con più parametri

Quindi, ecco l'accordo: sto cercando di imparare i generici Java e ho deciso di creare una semplice funzione di utilità di ricerca di array binario. Lo sto testando usando oggetti personalizzati e interi. Per ottenere feedback su errori e avvertenze sto usando Eclipse. Ecco cosa ho:

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; 
    } 
} 

Quindi ovviamente ricevo gli avvisi per i tipi di Raw che dicono che i generici devono essere parametrizzati. Come posso farlo correttamente dato che ho più parametri che entrambi devono essere dello stesso tipo?

SOLUZIONE

Ecco la soluzione di lavoro utilizzando farmaci generici con il corretto controllo dei parametri:

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

Proprio ti permette di sapere, questo non riuscirà se si passa in una lunghezza zero o array null. –

+0

Sì, è un esempio banale: mi interessa il concetto di generici multipli, non la ricerca binaria. Grazie comunque. – jjNford

risposta

9

è possibile specificare specifica funzione parametro generico in questo modo

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

cosa fa il per questo? Solo curioso è tutto - lo vedo spesso ma mai con una spiegazione. – jjNford

+1

è un po 'più di sicurezza di tipo e consente una maggiore flessibilità in modo da poter passare una matrice di qualcosa la cui superclasse implementa Comparabile –

+4

@ratchetfreak Non esattamente ... Sta dicendo che 'T' può essere un tipo di cose che sono paragonabili ad alcune superclasse di 'T', mentre forzando' arr' e 'elm' per essere ancora un array e un elemento dello stesso tipo. – trutheality

5

Questo è il tipico modo per creare funzioni generiche:

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

Per extra generalità, item non hanno di essere dello stesso tipo le cose nella matrice sono, e le cose nella matrice non hanno essere Comparable dal momento che non li sta confrontando per niente, quindi

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

dà una maggiore flessibilità.

+0

bello! mi stavo chiedendo anche questo. per il contesto penso che un approccio più rigoroso sarebbe migliore, ma è bello saperlo. Grazie. – jjNford

+0

ottima risposta, ma basta battere per il pugno, io def def la tua risposta però, grazie a una tonnellata. – jjNford