我正在尝试在Java中创建一个泛型函数,以找出ArrayList与ArrayLists的ArrayList中的列表之间的最大相似性。
public static int maxSimilarity(ArrayList<?> g,
ArrayList<ArrayList<?>> groups){
int maxSim = 0;
for(ArrayList<?> g2:groups){
int sim = similarity(g, (ArrayList<?>) g2);
if(sim > maxSim)
maxSim = sim;
}
return maxSim;
}
但是,当我尝试在我的main函数中调用它时,它会显示一个不兼容的错误
ArrayList<ArrayList<Points>> cannot be converted to ArrayList<ArrayList<?>>
我不明白,我认为所有的物体都可以代表?标志。此外,它适用于我的相似函数,在两个ArrayLists之间:
public static int similarity(ArrayList<?> g1, ArrayList<?> g2){
int total = 0;
for(Object o1:g1){
for(Object o2:g2){
if(o1.equals(o2))
total++;
}
}
return total;
}
答案 0 :(得分:3)
而不是通配符,声明一个通用值:
public <T> static int maxSimilarity(List<T> g, List<? extends List<T>> gs);
答案 1 :(得分:2)
将您的方法签名更改为:
public static int maxSimilarity(ArrayList<?> g, ArrayList<? extends ArrayList<?>> groups)
通常更喜欢使用接口类型,而不是实际的实现(更灵活,代码更少):
public static int maxSimilarity(List<?> g, List<? extends List<?>> groups)
[edit]根据类型变量的建议,为了使这个超级泛型,它应该是:
public static <T> int maxSimilarity(List<? extends T> g, List<? extends List<? extends T>> groups)
请注意? extends T
。这样,你就可以使用例如。
List<List<StringBuilder>> groups = // ...
List<String> g = // ...
maxSimilarity(g, groups);
(StringBuilder
和String
是CharSequence
,因此可以进行比较。
答案 2 :(得分:1)
如果要比较类似对象的列表,则应引入方法类型参数
public static <T> int maxSimilarity(List<T> g, List<List<T>> groups) {
因为它比较完全不同的物体几乎无用。
答案 3 :(得分:0)
尝试声明您的方法:
public static <T>int maxSimilarity(ArrayList<T> g, ArrayList<ArrayList<T>> groups)
希望它有所帮助。