Java 泛型代码

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

但是在编译时,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;
            }
        }
    }

最佳答案

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

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

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

关于Java 泛型代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638904/

相关文章:

java - 如何在 List 的每个元素上调用方法?

java - 使用 MongoDB 和 Spring Data JPA 的复合主键

c# - C# 方法签名中的类型转换

java - 用 Java 编写响应处理程序

java - 使用 Streams API 和 Collectors.toMap() 使用对象引用作为键构造一个 Map

java - 递归查找二进制数的程序

null - 使用单个空参数调用 Java varargs 方法?

c# - 将字典值转换为数组

java - 强制转换和泛型如何工作?

java - 在条件函数中返回 CompletableFuture<Void>