3

I have two types of lists:

ArrayList<String> sList;
ArrayList<Resource rList;

I can call a .getName() method on the resource object.

I want to be able to print out either of those lists by calling a printList(list) metod like this:

printList(sList);
printList(rList);

And the code for them would look like this:

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() + ", ");
   }
}

I don't have any particular reason for using private static, it just happened to be like that because eclipse suggested it.

The code, however, does not work. Eclipse gives me following error:

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

GUI is my class. What is wrong?

EDIT: Is there any alternative or work-around to get the functionality I want?

4

4 回答 4

6

由于类型擦除,两种方法都具有相同的签名,即编译器同时看到它们

作为

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);
    }
}
于 2013-06-20T12:49:50.760 回答
2

在类型擦除过程中,Java 编译器擦除所有类型参数,如果类型参数是有界的,则将每个类型参数替换为其第一个边界,如果类型参数是无界的,则将其替换为 Object。

擦除泛型类型之后, 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() + ", ");
   }
}
于 2013-06-20T12:51:30.783 回答
2

您的两种printList方法具有相同的方法签名。使用不同的泛型类型不会使参数因重载而不同。编译器只看到

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

所以它无法弄清楚你想调用哪个方法。

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

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

于 2013-06-20T12:51:42.970 回答
1

泛型资源/字符串仅在编译器时存在。在运行时无法区分这两种方法

于 2013-06-20T12:50:57.273 回答