繁体   English   中英

可比是原始类型。 对通用类型Comparable的引用 <T> 应该参数化

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

我将我的变量设置为

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()));

应该使用哪种类型的泛型来避免警告?

可比显然是通用类型。

因此,您只需要:

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

代替

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

或者您想比较另一种类型..?

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

您当前的方案有几处错误。

  1. ComparatorComparable是比较对象的两种不同方法。 您将两者混淆了。
  2. 您正在尝试将一个比较功能存储到地图中。 稍后,您从映射中获取值,然后尝试将其(函数)与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<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 );
}

现在,您可以将属性存储到地图中,然后将这些属性与值进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM