java采用具有相同方法名称的不同列表类型

时间:2016-11-12 03:36:43

标签: java list

是否可以使用多个具有相同名称但具有不同List类型的方法。这当然通过覆盖定期工作,但java无法区分两种不同的List类型。除了拥有不同的名字之外,还有其他方法吗?例如:

  /**
   * Prints a given in list, only works on numerical types
   */
public static void printList(List list) {
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i));
        if (i != list.size() - 1) System.out.print(", ");
    }
    System.out.println();
}
如果我们有

将无效

  /**
   * Prints a given in list of Vector3i
   */
public static void printList(List<Vector3i> list) {
    for (int i = 0; i < list.size(); i++) {
        System.out.print("(");
        System.out.print(list.get(i).x);
        System.out.print(", ");
        System.out.print(list.get(i).y);
        System.out.print(", ");
        System.out.print(list.get(i).z);
        System.out.print(")");
        if (i != list.size() - 1) System.out.print(", ");
    }
    System.out.println();
}

在同一个班级。

3 个答案:

答案 0 :(得分:2)

不,因为类型擦除它将属于同一类并且实际上具有相同的签名,这导致名称冲突。 有一个很好的SO线程 - Java generics - type erasure - when and what happens

答案 1 :(得分:2)

由于Java type erasure,您不能重载具有List<T>等泛型类型的方法。两种方法在运行时都具有相同的签名,即void printList(List list),这是不可能的。

但是,您始终可以覆盖toString或在类中实现自定义打印功能,并使用单个printList方法而不是两个方法,这是此处的方法。

以下是一个例子:

public class Vector3i {

    // Do stuff...

    @Override
    public String toString() { 
        return "(" + x + ", " + y + ", " + z +")";
    }
}

你的打印功能:

public static <T> void printList(List<T> list) {
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i).toString());
        if (i != list.size() - 1)
            System.out.print(", ");
    }
    System.out.println();
}

答案 2 :(得分:0)

正如前面的答案所描述的那样,由于类型擦除,没有办法实现这一点,但我想重新解释一下这个问题:

你为什么要关心这种类型?

在这种情况下,您没有执行任何类型特定的操作,因此您可以使用此表单:

public void printList(List<?> list) {
    // printing logic here
}

这将接受任何类型的列表,而无需担心列表的类型,并且仍然是类型安全的。