列表的通用列表Java

时间:2014-02-18 14:10:09

标签: java generics arraylist

我正在尝试在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;
}

4 个答案:

答案 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);

StringBuilderStringCharSequence,因此可以进行比较。

答案 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)

希望它有所帮助。