通用类型扩展接口,无法访问接口方法而无需警告

时间:2014-11-11 17:09:43

标签: java generics hashmap comparable

如果我有一个通用类,

public class Graph<K, V extends Comparable> {
     ...
 }

我的理解是类型V的任何对象都具有可比性,因为它扩展了Comparable接口。现在我想在班上使用HashMap<K, V>。我的地图中的V类型的对象仍应具有可比性。我声明了一个方法:

public V getMin(HashMap<K, V> map, V zero) {
     V min = zero;
     for (V value : map.values()) {
         if (value.compareTo(min) < 0) {
            min = value;
         }
     }
     return min;
}

编译时,我收到警告

warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type
Comparable

if (value.compareTo(min) < 0) {

where T is a type-variable:
T extends Object declared in interface comprable

我将此警告解释为编译器不确定value是否具有可比性。为什么不?这是什么问题,我该如何解决它?

2 个答案:

答案 0 :(得分:7)

Comparable接口被声明为raw。它应该用作

YourGenericInterfaceHere extends Comparable<YourGenericInterfaceHere>

YourGenericClassHere implements Comparable<YourGenericClassHere>

在泛型中,您将使用extends

YourGenericElement extends Comparable<YourGenericElement>

简而言之,您应该将您的课程声明为:

public class Graph<K, V extends Comparable<V>> {
    //rest of code...
}

答案 1 :(得分:2)

Comparable是泛型类型,因此在声明类型参数V扩展Comparator时,接口应该参数化:

public class Graph<K, V extends Comparable<V>> {