【问题标题】:Java type parameter in static method compile time [duplicate]静态方法编译时的Java类型参数[重复]
【发布时间】:2016-05-17 11:47:22
【问题描述】:

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

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

}

}

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

【问题讨论】:

标签: java generics types compile-time


【解决方案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 检查并提供了一些编译时类型保证。

【讨论】:

    【解决方案2】:

    除了if 之外,您还可以制作一个将类与其比较器相关联的映射:Map&lt;Class&lt;?&gt;,Comparator&lt;?&gt;&gt;。该类可通过getClass() 方法获得。

    如果你想处理多态,那么你必须在每个对象上调用getSuperclass(),直到你找到一个共同的祖先。

    【讨论】:

      【解决方案3】:

      这个你检查了泛型类型为String,并没有编译,因为1不是String

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

      但在下面你不检查泛型类型,并自动编译器将其检查为Object,并通过Object 类型。

      compare(SomeObject.getDate(), 1);
      

      您必须在比较方法中添加 Object 大小写

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-21
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 2020-11-19
        • 2011-02-13
        相关资源
        最近更新 更多