Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通用比较器警告_Java_Generics - Fatal编程技术网

Java 通用比较器警告

Java 通用比较器警告,java,generics,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) {

我有这个:

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);
    }
}
import java.util.*;
导入java.io.*;
类MyComparator实现比较器{
公共整数比较(Map.Entry me1,Map.Entry me2){
List v1=me1.getValue();
List v2=me2.getValue();
如果(v1.size()>v2.size())
返回1;
else if(v1.size()=minGroupSize)
System.out.println(o+“:”+m.get(o.size()+”:“+m.get(o));
}
}
私有静态字符串字母顺序(字符串s){
char[]a=s.toCharArray();
数组。排序(a);
返回新字符串(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>)
javacode$javac-Xlint:unchecked Anagrams1.java
Anagrams1.java:45:警告:[未选中]未选中的方法调用:类数组中的方法排序应用于给定类型
sort(arr,新的MyComparator());
^

必需:T[],Comparator您已经定义了
类MyComparator

您正在调用
new MyComparator()
。使用
对象[]

这应该会给你它给你的确切警告-它应该根据你的代码定义
new MyComparator()


我还建议将正确键入的
列表
而不是
对象[]
作为第一个参数,并使用
集合。排序

我建议有两种方法:


  • 用于获取类型为
    T[]
    的元素数组。这很棘手,因为您需要
    T
    成为
    Map.Entry
    ,并且您不能直接创建其中一个,因为泛型是不可重新定义的类型
  • 将元素复制到
    ArrayList
    (例如,使用
    新的ArrayList(m.entrySet())
    )中,然后调用
    集合。对该集合进行排序

  • 后者是我的首选方法,因为集合比普通数组具有类型安全优势。

    这仍然会在将
    Map.Entry[]
    分配给
    Map.Entry[]
    时向您发出警告,但
    arrays.sort
    调用不会发出任何警告:

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

    如果您想使用数组进行排序,我认为您无法逃脱该警告,因为您无法创建泛型数组的实例,因此
    c.toArray(new Map.Entry[0])
    无法通过编译。

    好吧,因为这是关于泛型和(几乎)的第三个问题(包括已删除的问题)同样的代码:你读过关于泛型的东西吗?它们是如何工作的,如何使用它们?@Tom我读了教程,现在又在读了。我觉得从人们那里得到一些建议来补充我的阅读是一个快速学习的好方法。我目前正在阅读这篇文章:使用
    Collections.sort
    将消除使用更改后无法编译的数组(以及额外警告)的需要:javacode$java Anagrams1./dictionary.txt 8线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Object;无法转换为Anagrams1.main处的[Ljava.util.Map$Entry;](Anagrams1.java:44)正在尝试Collections.sort方法。为什么我不能执行强制转换,为什么会出现上述错误?@abc尝试新代码。我尝试了此代码的多个版本,但最终提出了一个我没有检查的版本,该版本无效。对此,我深表歉意。@Eran它成功了,但给出了两个警告代码:警告:“你不能直接创建其中的一个,因为泛型是不可恢复的类型。”这是什么意思?你能用简单的术语解释一下吗?