2015-03-27 16 views
5

Napisałem następujący kod:Jak napisać ogólną metodę Java i porównać dwie zmienne typu ogólnego w metodzie?

private static <T> T getMax(T[] array) { 
     if(array.length == 0) { 
      return null; 
     } 

     T max = array[0]; 
     for (int i = 1; i < array.length; i++) { 
      if (array[i] > max) 
       max = array[i]; 
     } 
     return max; 
    } 

problem jest w tym wierszu: if(array[i] > max).

Rozumiem, że Java nie może zrozumieć operatora > w przypadku nieznanych/dowolnych klas.

W tym samym czasie nie chcę pisać innych metod dla obiektów zajęć, które wiem, że będę wysyłał.

Czy istnieje obejście?

+2

Najprościej jest, aby wymusić, że typ T muszą być porównywalne. Możesz go zmienić na '>' następnie użyj 'compareTo'. –

+0

Lub użyj [Komparatora] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html). – fabian

Odpowiedz

6

Musisz zmienić T do T extends Comparable<T> i użyć metody compareTo. Czyli:

  • private static <T extends Comparable<T>> T getMax(T[] array) i
  • if (array[i].compareTo(max) > 0) { ... }

Należy jednak pamiętać, że można użyć

maxElement = Collections.max(Arrays.asList(array)); 
+0

Nr max to tylko przykład. Dzięki. Mam rację. –

+0

Ah, ok. Pewnie, że nie ma za co. – aioobe

3

Tak, istnieje obejście, przez dodanie Comparable górną granicę do T .

Ponieważ operator < nie działa na obiektach, należy użyć równoważnej funkcji, która jest metodą compareTo w interfejsie Comparable.

Upewnij się, że typ T jest Comparable, określając górną granicę.

private static <T extends Comparable<T>> T getMax(T[] array) 

Następnie w miejscu operatora >, zadzwoń compareTo:

if(array[i].compareTo(max) > 0) 
Powiązane problemy