是否可以使用多个具有相同名称但具有不同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();
}
在同一个班级。
答案 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
}
这将接受任何类型的列表,而无需担心列表的类型,并且仍然是类型安全的。