java - Comparable 是原始类型。对泛型类型 Comparable<T> 的引用应该参数化

标签 java generics lambda functional-programming

我正在设置我的变量,例如

Map<String, Function<CLASS_NAME, Comparable>> map = new HashMap<>();

其中Comparable给出的警告消息为

Comparable is a raw type. References to generic type Comparable<T> should be parameterized

我正在使用它

map.put(VARIABLE_NAME1, s -> s.getStringProperty());
map.put(VARIABLE_NAME2, s -> s.getIntProperty());
..

我正在使用类似的比较

Comparator<CLASS_TYPE> v = Comparator.comparing(map.get(VARIABLE_NAME), Comparator.nullsFirst(Comparator.naturalOrder()));

应该使用什么类型的泛型来避免警告?

最佳答案

您当前的方案存在一些问题。

  1. ComparatorComparable 是比较对象的两种不同方法。你把两者混淆了。
  2. 您正在尝试存储一个与 map 进行比较的函数。稍后,您从映射中获取值并尝试将其(函数)与 Comparator 进行比较。这是行不通的,因为您无法将一个函数与除另一个函数之外的任何函数进行比较。
  3. 您实际上并不在任何地方存储值;您只存储一个函数。
  4. 在您的示例中,您将两个不同的值存储到同一个 VARIABLE_NAME。这是故意的吗?

如果要创建属性映射,则需要创建一个可存储对象,该对象可以存储到映射中,并且可以将其值与提供的值进行比较。例如,

class Storable<T extends Comparable<T>> {
  private final T value;
  Storable(T value) {
    this.value = value;
  }
  int compareTo(Object other) {
    if ( value.getClass().equals(other.getClass()) ) {
      return value.compareTo( (T) other );
    }
    return -1;
  }
}

现在创建适当的子类:

class StorableInt extends Storable<Integer> {
    StorableInt(Integer t) {
        super(t);
    }
}
class StorableString extends Storable<String> {
    StorableString(String s) {
        super(s);
    }
}

您的属性 map 现在如下所示:

Map<String, Storable<?>>map = new HashMap<>();

map.put(variableName1, new StorableInt(13));
map.put(variableName2, new StorableString("string2"));

<T extends Comparable<T>> int compare( String key, T val ) {
  return map.get( key ).compareTo( val );
}

您现在可以将属性存储到 map 中并将值与这些属性进行比较。

关于java - Comparable 是原始类型。对泛型类型 Comparable<T> 的引用应该参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53863262/

相关文章:

c++ - GCC constexpr constexpr 函数中的 lambdas 和编译时的评估

javascript - 推送时获取 Firebase UID,然后在 Java 中使用给定的 UID 再次推送

java - 旋转 BufferedImage 会导致其位置发生变化

java - 如何让Java JPA创建实体?

java - 填充和排序列表 <?扩展条款与条件>

Java 8 : Get Operator-Function-Object with method reference

java - 在正在运行的 GUI 环境中运行 Java 方法的最佳实践

java - 无法从 Guava 解析通用参数 TypeToken

java - 是否可以在 Java 中指定类型参数的上限和下限约束?

Java流,根据两个不同的对象创建新对象