通用比较器警告

时间:2015-06-28 06:24:22

标签: java generics

我有这个:

import java.util.*;
import java.io.*;

class MyComparator<K,V> implements Comparator<Map.Entry<K,List<V>>> {

    public int compare(Map.Entry<K,List<V>> me1, Map.Entry<K,List<V>> me2) {

                List<V> v1 = me1.getValue();
                List<V> v2 = me2.getValue(); 

                if(v1.size() > v2.size())
                    return 1;
                else if(v1.size() < v2.size())
                    return -1;
                else
                     return 0;
    }
}

public class Anagrams1 {
    public static void main(String[] args) {
        int minGroupSize = Integer.parseInt(args[1]);

        // Read words from file and put into a simulated multimap
        Map<String, List<String>> m = new HashMap<String, List<String>>();

        try {
            Scanner s = new Scanner(new File(args[0]));
            while (s.hasNext()) {
                String word = s.next();
                String alpha = alphabetize(word);
                List<String> l = m.get(alpha);
                if (l == null)
                    m.put(alpha, l=new ArrayList<String>());
                l.add(word);
            }
        } catch (IOException e) {
            System.err.println(e);
            System.exit(1);
        }

        // Print all permutation groups above size threshold
        Collection<Map.Entry<String,List<String>>> c = m.entrySet();
        Object[] arr = c.toArray();
        Arrays.sort(arr, new MyComparator());
        for(Object o : arr) {
            if(m.get(o).size() >= minGroupSize)

                System.out.println(o + " : " + m.get(o).size() + ": " + m.get(o)); 

        }
    }

    private static String alphabetize(String s) {
        char[] a = s.toCharArray();
        Arrays.sort(a);
        return new String(a);
    }
}

这给了我两个警告:

  javacode$ javac -Xlint:unchecked Anagrams1.java

  Anagrams1.java:45: warning: [unchecked] unchecked method invocation: method sort in class Arrays is applied to given types
          Arrays.sort(arr, new MyComparator());

                     ^
    required: T[],Comparator<? super T>

    found: Object[],MyComparator

    where T is a type-variable:

      T extends Object declared in method <T>sort(T[],Comparator<? super T>)

  Anagrams1.java:45: warning: [unchecked] unchecked conversion

          Arrays.sort(arr, new MyComparator());

                           ^
    required: Comparator<? super T>

    found:    MyComparator

    where T is a type-variable:

      T extends Object declared in method <T>sort(T[],Comparator<? super T>)

需要帮助。感谢。

3 个答案:

答案 0 :(得分:1)

您已定义class MyComparator<K,V>

您正在呼叫new MyComparator()。使用Object[]

这应该会给你提供给你的确切警告 - 期望根据你的代码定义new MyComparator<String, String>()

我还建议传入正确输入的List而不是Object[]作为第一个参数,并使用Collections.sort代替。

答案 1 :(得分:1)

我建议采用两种方法:

  1. 使用Collection#toArray(T[])获取T[]类型元素的数组。这很棘手,因为您需要T成为Map.Entry<K,List<V>>,并且您无法直接创建其中一个,因为泛型是不可重复的类型。
  2. 将元素复制到ArrayList(例如使用new ArrayList<>(m.entrySet())),然后在其上调用Collections.sort
  3. 后者是我的首选方法,因为Collections比普通数组具有类型安全优势。

答案 2 :(得分:1)

Map.Entry[]Map.Entry<String,List<String>>[]的分配过程中,这仍会给您一个警告,但Arrays.sort来电不会发出任何警告:

    Map.Entry<String,List<String>>[] arr = c.toArray(new Map.Entry[0]);
    Arrays.sort(arr, new MyComparator<String,String>());

如果你想使用数组进行排序,我不认为你可以逃脱警告,因为你不能创建一个通用数组的实例,所以c.toArray(new Map.Entry<String,List<String>>[0])赢了& #39; t通过编译。