2016-05-17 12 views
-1

私は汎用比較ユーティリティを書いていますので、可能な限り型の安全である必要があります。アイデアは、異なるクラスオブジェクトの比較を防止することです。たとえば、これは正常に動作します:静的メソッドのJava型パラメータコンパイル時

UtilityClazz.<String>compare("dd", 1); //OK - compile time error 

タイプパラメータを持つユーティリティクラスを呼び出すより洗練された方法がありますか?可能な限りメソッド呼び出しがエレガントにする方法

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

} 

}

:それは日付を比較し

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

メソッドのコードをint型になるので、以下これがOKではないでしょうか?あなたはそれが簡単にメソッドオーバーロードではなく、ジェネリックで行うことができます

+0

この回答は役に立つかもしれません:http://stackoverflow.com/questions/16069106/how-to-compare-two-java-objects –

+0

最初にそれを削除してください** ** _UtilityClazzから。 compare( "dd"、1); _ – emotionlessbananas

+0

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

答えて

1

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

これにより、不要なinstanceofチェックを排除し、いくつかのコンパイル時の型保証を提供します。

0

1がStringではありませんので、あなたがStringとしてジェネリック型をチェックし、doesntのは、コンパイルこの1:

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

いますが、ジェネリック型をチェックし、自動的にObjectとして小切手にそれをコンパイラいけない、とObject型が渡され、以下の。 Map<Class<?>,Comparator<?>>

compare(SomeObject.getDate(), 1); 

あなたはifのセリエAを持つの

0

代わりにあなたの比較方法にObjectケースを追加する必要があり、あなたはそのコンパレータにクラスを関連付けるマップを作ることができます。このクラスは、メソッドから利用できます。

多型を処理する場合は、共通の祖先を見つけるまで、各オブジェクトに対してgetSuperclass()を呼び出す必要があります。

関連する問題