2015-03-27 17 views
5

Ho scritto il seguente codice:Come scrivere un metodo Java generico e confrontare due variabili del tipo generico all'interno del metodo?

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

Il problema è in questa linea: if(array[i] > max).

Capisco che Java non possa comprendere l'operatore > in caso di classi sconosciute/arbitrarie.

Allo stesso tempo, non voglio scrivere metodi diversi per gli oggetti delle classi che so che invierò.

C'è una soluzione alternativa?

+2

La cosa migliore è quello di forzare che il tipo T deve essere paragonabile. Puoi cambiarlo in ">", quindi usare 'compareTo'. –

+0

Oppure utilizzare un [Comparatore] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html). – fabian

risposta

6

è necessario modificare T-T extends Comparable<T> e utilizzare il metodo compareTo. Cioè:

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

Ma si noti che è possibile utilizzare

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

No. max è solo un esempio. Grazie. Ho capito il punto. –

+0

Ah, ok. Certo che sei il benvenuto. – aioobe

3

Sì, c'è una soluzione, con l'aggiunta di un balzo Comparable superiore a T .

Poiché l'operatore < non funziona sugli oggetti, è necessario utilizzare la funzionalità equivalente, che è il metodo compareTo nell'interfaccia Comparable.

Verificare che il tipo T sia Comparable fornendo un limite superiore.

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

Poi, al posto dell'operatore >, chiamare compareTo:

if(array[i].compareTo(max) > 0) 
Problemi correlati