2013-06-20 162 views
3

重载方法我有两个类型的列表:打印列表

ArrayList<String> sList; 
ArrayList<Resource rList; 

我可以调用资源对象的.getName()方法。

我想通过调用printList(list)梅托德这样才能够打印出任何名单:

printList(sList); 
printList(rList); 

并为它们的代码是这样的:

private static void printList(ArrayList<String> list){ 
    for(String s : list){ 
     System.out.println(s + ", "); 
    } 
} 

private static void printList(ArrayList<Resource> list){ 
    for(Resource r : list){ 
     System.out.println(r.getName() + ", "); 
    } 
} 

我不没有任何特别的理由使用private static,它恰好就是这样,因为日食暗示它。

但是,代码不起作用。 Eclipse给我以下错误:

"Method printList(ArrayList) has the same erasure printList(ArrayList) as another method in type GUI"

GUI是我的课。哪里不对?

编辑:有没有其他选择或解决方法来获得我想要的功能?

+0

http:// stackoverflow。com/questions/3861250/static-method-overloading-with-generics –

回答

6

由于type erasure两种方法具有相同的签名,即编译器看到他们两个

private static void printList(ArrayList list) 

使得然后相互区别,而且导致编译错误。如果您希望编译代码,您需要更改签名,例如

private static void printStringList(ArrayList<String> list) 
private static void printResourceList(ArrayList<Resource> list) 

,或者如果toString已经在所有List类型被覆盖,您可以使用通用的格式,如

private static <T> void printList(List<T> list) { 
    for (T t: list) { 
     System.out.println(t); 
    } 
} 
+0

谢谢,这很有帮助。 =) – Goatcat

+0

是否有可能做这样的事情: '私有静态无效的printList(ArrayList的名单){ 如果(list.getClass()等于(ArrayList的)){// 做一些 }否则,如果(名单.getClass()。等于(ArrayList的)){// 做别的事情 }其他{// 做别的事情 } }' – Goatcat

+0

对不起,没有时间来编辑它,所以它看起来不错,希望无论如何你都能理解! – Goatcat

1

仿制药资源/字符串只存在在编译时使用多态,你的优势。在运行时,它是不可能将两种方法区别Erasure of Generic Types JVM把他们当作

private static void printList(ArrayList<> list){ 
    for(String s : list){ 
     System.out.println(s + ", "); 
    } 
} 

private static void printList(ArrayList<> list){ 
    for(Resource r : list){ 
     System.out.println(r.getName() + ", "); 
    } 
} 
2

During the type erasure process, the Java compiler erases all type parameters and replaces each with its first bound if the type parameter is bounded, or Object if the type parameter is unbounded.

后。为了重载目的,使用不同的泛型类型不会使参数不同。编译器只看到

private static void printList(ArrayList list) 
private static void printList(ArrayList list) 

所以它不能找出你想调用哪种方法。

如果你想有两个独立的printList方法,他们需要有不同的签名。

注意static只是因为这些方法不访问任何实例变量。

2

您的两个printList方法具有相同的方法签名