Java通用列表
我试图在Java中创建一个泛型函数,以找出ArrayList和ArrayList中的列表之间的最大相似性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(
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) {