Java通用列表

Java通用列表,java,generics,arraylist,Java,Generics,Arraylist,我试图在Java中创建一个泛型函数,以找出ArrayList和ArrayList中的列表之间的最大相似性 public static int maxSimilarity(ArrayList<?> g, ArrayList<ArrayList<?>> groups){ int maxSim = 0; for(ArrayList<?> g2:groups){ int sim = similarity(

我试图在Java中创建一个泛型函数,以找出ArrayList和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;
}
publicstaticint-maxSimilarity(arraylistg,
ArrayList g2:组){
int sim=相似性(g,(ArrayList)g2);
如果(sim>maxSim)
maxSim=sim;
}
返回maxSim;
}
然而,当我试图在我的主函数中调用它时,它显示了一个不兼容的错误

ArrayList<ArrayList<Points>> cannot be converted to ArrayList<ArrayList<?>>

ArrayList无法转换为ArrayList将方法签名更改为:

public static int maxSimilarity(ArrayList<?> g, ArrayList<? extends ArrayList<?>> groups)

StringBuilder
String
是一个
CharSequence
,因此可以对它们进行比较)。

尝试声明您的方法:

public static <T>int maxSimilarity(ArrayList<T> g,  ArrayList<ArrayList<T>> groups)
publicstaticintmaxsimilarity(arraylistg,arraylistgroups)

希望有帮助。

请声明一个通用值,而不是通配符:

public <T> static int maxSimilarity(List<T> g, List<? extends List<T>> gs);

publicstaticintmaxsimilarity(List g,List如果要比较相似对象的列表,应该引入一个方法类型参数

public static <T> int maxSimilarity(List<T> g, List<List<T>> groups) {
publicstaticintmaxsimilarity(列表g,列表组){

因为比较完全不同的对象几乎是无用的。

如何调用
maxSimilarity
?maxSimilarity(points,listofpoints),其中points是ArrayList,listofpoints是ArrayList。我不同意为此继续使用通配符,它只会比指定单个类型更模糊(“
T
”@Rogue视情况而定,但如果您真的想引入类型参数,您应该在编辑中这样做(给出原因)@user2977065原因是Java泛型中的类型协方差/逆变。在这里的注释中解释有点太多了,只需谷歌一下或在这里搜索一下就可以了。有很好的解释。@qqilihq你想做的事情并不总是
有必要扩展
吗?难道我们不能只编写
公共静态int-maxSimila吗rity(列表g,列表gs)
?只需确保…@Autar当您放弃使用
扩展
运算符时,它将不会明确接受除
列表
之外的任何类型。通过在泛型下包含
扩展
,您也可以允许所有子类型。您甚至可以将扩展放在
T
声明本身上,以便进行比较属于
T
的亚型,但通常这是无关的。
List<List<StringBuilder>> groups = // ...
List<String> g = // ...
maxSimilarity(g, groups);
public static <T>int maxSimilarity(ArrayList<T> g,  ArrayList<ArrayList<T>> groups)
public <T> static int maxSimilarity(List<T> g, List<? extends List<T>> gs);
public static <T> int maxSimilarity(List<T> g, List<List<T>> groups) {