我正在编写通用比较实用程序,它应尽可能是类型安全的。想法是防止不同类对象的比较。例如,这可以正常工作:
UtilityClazz.<String>compare("dd", 1); //OK - compile time error
是否有更优雅的方式来调用具有类型参数的Utility类。下面这个不行,因为它会比较Date和int
compare(SomeObject.getDate(), 1); //NOT OK - compiles OK no type is passed
方法代码:
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;
}
}
}
如何使方法调用尽可能优雅?
答案 0 :(得分: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
检查,并提供了一些编译时类型保证。
答案 1 :(得分:0)
这个你检查泛型类型为String
,并且没有编译,因为1不是String
:
UtilityClazz.<String>compare("dd", 1);
但在下面你不检查泛型类型,并自动编译器将其检查为Object
,并传递Object
类型。
compare(SomeObject.getDate(), 1);
您必须将Object
案例添加到比较方法
答案 2 :(得分:0)
您可以创建一个将类与其比较器关联起来的映射:if
,而不是拥有Map<Class<?>,Comparator<?>>
的系列。该课程可通过getClass()
方法获得。
如果你想处理多态,那么你必须在每个对象上调用getSuperclass()
,直到你找到一个共同的祖先。