2012-05-06 26 views
6

Widziałem przykłady na stronie, które dotyczą generyków z wieloma parametrami, ale żaden nie działa w mojej sytuacji.Generic Java z wieloma parametrami

Oto, czym jest umowa: Próbuję nauczyć się generycznych Java i postanowiłem utworzyć prostą funkcję wyszukiwania tablicy binarnej. Testuję to za pomocą niestandardowych obiektów i liczb całkowitych. Aby uzyskać informację zwrotną na temat błędów i ostrzeżeń, używam Eclipse. Oto, co mam:

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

Tak więc dostaję ostrzeżenia dla typów Raw, mówiąc, że generics powinny być sparametryzowane. Jak mogę to zrobić poprawnie, biorąc pod uwagę, że mam wiele parametrów, które muszą być tego samego typu?

ROZWIĄZANIE

Oto roztwór roboczy przy użyciu rodzajowych z poprawnymi kontroli parametrów:

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

Wystarczy powiadomieniem, to nie uda, jeśli przechodzą w zerowej długości lub zerowej tablicy. –

+0

Tak, to jest trywialny przykład - interesuje mnie pojęcie wielu leków generycznych, a nie binarnych. W każdym razie dzięki. – jjNford

Odpowiedz

9

można określić funkcję specyficznego parametru rodzajowego jak tak

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

co robi w tym celu ? Po prostu ciekawy - widzę to często, ale nigdy z wyjaśnieniem. – jjNford

+1

to dodatkowe bezpieczeństwo typów i pozwala na większą elastyczność, dzięki czemu możesz przekazać szereg rzeczy, których superklasa implementuje Porównywalne –

+4

@ratchetfreak Niezupełnie ... Mówi się, że 'T' może być typem rzeczy, które są porównywalne do jakiejś nadklasy 'T', podczas gdy forsowanie' arr' i 'elm' nadal pozostaje tablicą i elementem tego samego typu. – trutheality

5

Jest to typowy sposób na tworzenie funkcji Generic:

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

Dla extra ogólność, item nie ma ma być tego samego typu rzeczy w tablicy są i rzeczy w tablicy nie mają być Comparable ponieważ nie jesteś porównując je do niczego, więc

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

daje pewną dodatkową elastyczność.

+0

fajnie! Też się nad tym zastanawiałem. dla kontekstu myślę, że bardziej rygorystyczne podejście byłoby lepsze, ale to świetnie wiedzieć. dzięki. – jjNford

+0

świetna odpowiedź, ale po prostu uderzyć na cios, ale 1 odpowiedź na twoje pytanie, dzięki tona. – jjNford

Powiązane problemy