Java通用代码

Sag*_*gar 17 java generics java-8

我是仿制药的新手.你可以看到,我知道的确切类型后重复一些代码val,filterSmall,filterGreat.我想编写用于val与过滤器值进行比较的通用代码.我可以写这样的东西

  private  <T> boolean  compareAgainstFilters(T val, T filterSmall, T filterGreat) {
    if (!(filterSmall != null && filterSmall <= val)) {
        return true;
    } 

    if (!(filterGreat != null && val <= filterGreat)) {
        return true;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是在编译时,java不知道<=运算符是否对类型有效T.

我不想重复代码,那么我怎么能实现呢?

if (value != null) {
        switch (value.getClass().getName()) {
        case "java.lang.Long":
            Long filterSmall = (Long) filterSmaller;
            Long filterGreat = (Long) filterGreater;
            Long val = (Long) value;

            if (!(filterSmall != null && filterSmall <= val)) {
                return true;
            } 

            if (!(filterGreat != null && val <= filterGreat)) {
                return true;
            }
            break;

        case "java.lang.Float":
            Float filterSmallFloat = (Float) filterSmaller;
            Float filterGreatFloat = (Float) filterGreater;
            Float valFloat = (Float) value;

            if (!(filterSmallFloat != null && filterSmallFloat <= valFloat)) {
                return true;
            } 

            if (!(filterGreatFloat != null && valFloat <= filterGreatFloat)) {
                return true;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 24

您可以使用Comparable接口来比较数字,因为所有数字基元的包装类都实现它:

  private  <T extends Comparable<T>> boolean  compareAgainstFilters(T val, T filterSmall, T filterGreat) {
    if (!(filterSmall != null && filterSmall.compareTo(val)<=0)) {
        return true;
    } 

    if (!(filterGreat != null && val.compareTo(filterGreat)<=0)) {
        return true;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

<T extends Comparable<T>>限制可以用作类型参数而不是T的类型.在这种情况下,它们需要实现Comparable<T>.