静态方法编译时的Java类型参数

时间:2016-05-17 11:47:23

标签: java generics types compile-time

我正在编写通用比较实用程序,它应尽可能是类型安全的。想法是防止不同类对象的比较。例如,这可以正常工作:

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

}

}

如何使方法调用尽可能优雅?

3 个答案:

答案 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(),直到你找到一个共同的祖先。