2016-05-17 12 views
-1

Ich schreibe Universal-Vergleich-Dienstprogramm, sollte es Typ so sicher wie möglich sein. Die Idee besteht darin, den Vergleich verschiedener Klassenobjekte zu verhindern. Zum Beispiel funktioniert das OK:Java-Typ-Parameter in der statischen Methode Kompilierzeit

Gibt es elegantere Möglichkeit, Dienstprogramm-Klasse aufzurufen, die Typ Parameter hat. Dies ist unten nicht in Ordnung, weil es Datum vergleichen werden und

compare(SomeObject.getDate(), 1); //NOT OK - compiles OK no type is passed 

Methodencode int:

public static<T> int compare(T value1, T value2) { 
    if (value1 instanceof Time && value2 instanceof Time) { 
     return DateComparator.compareTimes((Time) value1, (Time) value2); 
    } else if (value1 instanceof Date && value2 instanceof Date) { 
     return DateComparator.compareDates((Date) value1, (Date) value2); 
    } else if (value1 instanceof Number && value2 instanceof Number) { 
     return NumberUtility.compare((Number) value1, (Number) value2); 
    } else { 
     //.... 
     return 0; 
    } 

} 

}

Wie Methodenaufruf elegant wie möglich machen?

+0

Diese Antwort könnte nützlich sein: http://stackoverflow.com/questions/16069106/how-to-compare-two-java-objects –

+0

zuerst entfernen, dass ** ** von _UtilityClazz. vergleichen ("dd", 1); _ – emotionlessbananas

+0

Siehe https://github.com/jeevatkm/generic-repo/blob/master/genericComparator/src/main/java/com/myjeeva/comparator/GenericComparator.java –

Antwort

1

Sie können es einfacher, mit -Methodenüberladung machen, anstatt mit Generika:

public static int compare(Time value1, Time value2) { 
    return DateComparator.compareTimes(value1, value2); 
} 

public static int compare(Number value1, Number value2) { 
    return NumberUtility.compare(value1, value2); 
} 

Dies vermeidet unnötige instanceof Kontrollen und gibt einige Compilertyp garantiert Zeit.

0

Dieses Sie generische Typ als String geprüft, und weil 1 kompilieren doesnt nicht String:

UtilityClazz.<String>compare("dd", 1); 

aber unterhalb Sie generische Typ nicht überprüfen, und automatisch überprüft sie als Object Compiler und Object Typ übergeben wird .

compare(SomeObject.getDate(), 1); 

Sie müssen Object Fall zu Ihrem vergleichen Methode hinzufügen

0

Statt eine Serie von if zu haben, können Sie eine Karte machen, die eine Klasse zu seinem Komparator zuordnet: Map<Class<?>,Comparator<?>>. Die Klasse ist über die getClass()-Methode verfügbar.

Wenn Sie mit Polymorphismus umgehen möchten, müssten Sie für jedes Objekt getSuperclass() aufrufen, bis Sie einen gemeinsamen Vorfahren finden.