2015-03-27 15 views
5

Ich habe den folgenden Code geschrieben:Wie schreibe ich generische Java-Methode und vergleiche zwei Variablen des generischen Typs innerhalb der Methode?

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

Das Problem in dieser Linie ist: if(array[i] > max).

Ich verstehe, dass Java den Operator > im Fall von unbekannten/beliebigen Klassen nicht verstehen kann.

Gleichzeitig möchte ich nicht verschiedene Methoden für die Objekte der Klassen schreiben, von denen ich weiß, dass ich sie senden werde.

Gibt es eine Problemumgehung?

+2

Ihre beste Wette ist zu zwingen, dass der Typ T vergleichbar sein müssen. Sie können es in '>' ändern und dann 'compareTo' verwenden. –

+0

Oder verwenden Sie einen [Comparator] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html). – fabian

Antwort

6

Sie müssen T-T extends Comparable<T> und verwenden Sie die compareTo Methode ändern. Das heißt:

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

Aber beachten Sie, dass Sie

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

Nein, max ist nur ein Beispiel. Vielen Dank. Ich verstehe. –

+0

Ah, ok. Sicher, du bist willkommen. – aioobe

3

Ja verwenden können, gibt es eine Abhilfe ist, durch das Hinzufügen einer Comparable obere Schranke zu T .

Da der Operator < nicht an Objekten arbeitet, müssen Sie die entsprechende Funktionalität verwenden, die compareTo-Methode in der Comparable Schnittstelle ist.

Stellen Sie sicher, dass der Typ TComparable ist, indem Sie eine obere Grenze angeben.

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

Dann anstelle des > Operator, rufen compareTo:

if(array[i].compareTo(max) > 0) 
Verwandte Themen