如何使这两个java泛型方法在同一个类中声明

如何使这两个java泛型方法在同一个类中声明,java,generics,methods,Java,Generics,Methods,我想声明两个方法。其中一个应该打印列表,另一个应该打印列表>。因此,我声明了以下代码,但它们有问题。有人能帮我解决这个问题吗 /* print the List<List<String>> */ public static <T> void print(List<List<T>> set) { if (set == null) return; for (List<T> subSet : set) {

我想声明两个方法。其中一个应该打印列表,另一个应该打印列表>。因此,我声明了以下代码,但它们有问题。有人能帮我解决这个问题吗

/* print the List<List<String>> */
public static <T> void print(List<List<T>> set) {
    if (set == null) return;
    for (List<T> subSet : set) {
        System.out.print("[");
        for (int i = 0; i < subSet.size() - 1; i++) {
            System.out.print(subSet.get(i) + ", ");
        }
        if (subSet.size() >= 1) {
            System.out.print(subSet.get(subSet.size() - 1));
        }
        System.out.println("]");
    }
}

 /* print the List<String> */
public static <T> void print(List<T> set) {
    if (set == null) return;
    int size = set.size();
    System.out.print("[");
    for (int i = 0; i < size - 1; i++) {
        System.out.print(set.get(i) + ", ");
    }
    System.out.println(set.get(set.size() - 1) + "]");
}
/*打印列表*/
公共静态无效打印(列表集){
if(set==null)返回;
用于(列表子集:集合){
系统输出打印(“[”);
对于(int i=0;i=1){
System.out.print(subSet.get(subSet.size()-1));
}
System.out.println(“]);
}
}
/*打印列表*/
公共静态无效打印(列表集){
if(set==null)返回;
int size=set.size();
系统输出打印(“[”);
对于(int i=0;i
如果编译器不知道第二个方法实际上是第一个类型,则可能会调用第二个方法

我会把它们结合起来

public static <T> void print(Collection<T> set) {
    if (set == null) {
       System.out.print("null");
       return;
    }
    System.out.print("[ ");
    String sep = "";
    for (T t : set) {
        System.out.print(sep);
        sep = ", ";
        if (t instanceof Collection) {
            print((Collection) t);
        } else {
            System.out.print(t);
        }
    }
    System.out.print(" ]");
}

public static <T> void println(Collection<T> set) {
    print(set);
    System.out.println();
}
公共静态无效打印(集合集){
if(set==null){
系统输出打印(“空”);
返回;
}
系统输出打印(“[”);
字符串sep=“”;
用于(T:集){
系统输出打印(sep);
sep=“,”;
if(集合的t实例){
打印((收集)t);
}否则{
系统输出打印(t);
}
}
系统输出打印(“]);
}
公共静态void println(集合集){
打印(套);
System.out.println();
}

由于通用擦除,这两种方法最终都是
print(List set)
,这当然是编译器不允许的。错误在编译器的错误中得到了解释。阅读错误消息。然后将第一个方法重命名为printListOfLists(或者您喜欢的任何名称)。当您打算调用第一个方法时,可能会调用第二个方法。如果这是您方法中的真实代码:为什么不直接调用
collection.toString()
而不是此方法?我认为通用参数
t
应该替换为通配符:
collection set
for(Object t:set)
@Calculator这不是完全一样吗?@Toddswell从语义上讲,方法签名是等价的。我的意思是,因为它是一个打印函数,只需要
toString()
列表项的方法,可以用通配符替换
T
。该函数不取出并重新插入项或类似的内容,这需要引入特定的类型参数
T
,以使其类型安全。至少我会用
(集合)替换
(集合)T
t
删除编译器警告。