有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

重载两个列表的Java方法

我想问一下,如何像这样重载java方法:

    public static int printAll(List<Class1> list) {
        int i = 0;
        for (Class1 e: list) {
                System.out.println(e.getName());
        }

        return i;
    }

    public static int printAll(List<Class2> list) {
        int i = 0;
        for (Class2 e: list) {
            System.out.println(e.getName());
        }
        return i;
    }

Class1Class2都实现了方法getName()

多谢各位


共 (3) 个答案

  1. # 1 楼答案

    在java中,泛型类型在运行时不存在,它们被称为Type Erasure的东西擦除。因此,定义两个这样的方法会给您一个编译时错误,即两个方法相互冲突并且both have the same erasure。然而,如果你想这样做,有一些方法可以做到这一点。其中一个已经在@Lungu Daniel的答案中。您还可以将List<Class2> list个参数更改为其他集合类型,如下所示:

    public static int printAll(LinkedList<Class1> list) {//You will have to cast it to LinkedList
        int i = 0;
        for (Class1 e: list) {
                System.out.println(e.getName());
        }
    
        return i;
    }
    
    public static int printAll(List<Class2> list) {
        int i = 0;
        for (Class2 e: list) {
            System.out.println(e.getName());
        }
        return i;
    }
    public static int printAll(Class3[] list) {//It can be an array too.
        int i = 0;
        for (Class3 e: list) {
            System.out.println(e.getName());
        }
        return i;
    }
    
  2. # 2 楼答案

    调用者必须为如何从列表中的对象获取名称传递额外的参数,这是否可以接受?您可以使用以下内容:

    public static <T> int printAll(List<T> list, Function<T, String> nameExtractor) {
        int i = 0;
        for (T e: list) {
            System.out.println(nameExtractor.apply(e));
        }
        return i;
    }
    

    然后,您可以将其称为:

    printAll(list1, Class1::getName);
    

    或:

    printAll(list2, Class2::getName);
    
  3. # 3 楼答案

    为Class1和Class2创建一个接口并实现它

    interface IClass {
       String getName();
    }
    
    class Class1 implements IClass {
         //your implementation
    }
    
    class Class2 implements IClass {
         //your implementation
    }
    

    并在方法签名中使用它

    public static int printAll(List<IClass> list) {
        int i = 0;
        for (IClass e: list) {
            System.out.println(e.getName());
        }
        return i;
    }