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它成功了,但给出了两个警告代码:警告:“你不能直接创建其中的一个,因为泛型是不可恢复的类型。”这是什么意思?你能用简单的术语解释一下吗?