2016-11-12 72 views
2

是否有可能拥有多个名称相同但带有不同列表类型的方法。这当然通过重写定期工作,但java无法区分两种不同的List类型。除了拥有不同的名字之外,有没有办法解决这个问题?例如:java采用不同的列表类型,使用相同的方法名称

/** 
    * 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(); 
} 

是行不通的。

+0

你不应该使用'List'。它基本上是**原始类型**。这意味着你的第一个方法将采用任何继承Object的类型。所以你的两个方法都可以把'Type'' Vector3i'作为类型。所以有碰撞。 – Blip

回答

2

你不能超载,你有一个泛型类型像List<T>方法,因为Java type erasure的。两种方法在运行时都具有相同的签名,即void printList(List list),这是不可能的。

但是,您总是可以覆盖toString或在您的课程中实现自定义打印功能,并且只有一个方法而不是两个,这是前往此处的方法。

下面是一个例子:

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

更新了答案。括号缺失,我添加了一个类型参数,所以你不使用**原始**类型。 – thatguy

0

正如前面所描述的答案,也没有办法做到这一点,由于类型擦除,但我d想改写这个问题:

你为什么在意这种类型?

在这种情况下,你什么都没有做键入特定的,所以你可以改用此表单:

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

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

相关问题