当前位置: 首页 > 知识库问答 >
问题:

Java使用相同的方法名获取不同的列表类型

宋成天
2023-03-14

是否可能有多个方法具有相同的名称,但采用不同的列表类型。这当然可以通过定期重写来实现,但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();
}

在同一个班级。

共有3个答案

阎晔
2023-03-14

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

你为什么关心类型?

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

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

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

杜元明
2023-03-14

不,因为类型擦除,它将属于同一类,并且实际上具有相同的签名,从而导致名称冲突。关于它有一个很好的线索——Java泛型——类型擦除——何时发生以及发生了什么

陆昕
2023-03-14

如果有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();
}

 类似资料:
  • 我可以看到它不工作,因为我尝试了它。我只是无法解释为什么一定要这样。 第二个方法来自一个类,该类是实现第一个getValue()方法的类的子类。 为什么同名不足以覆盖该方法?我想到的唯一论点是,它将反对“是一个”关系,因为用A扩展的第二个方法的类必须具有与A相同的能力,如果你重写返回类型,你就打破了那个法律,对吧?

  • 我需要编写一个java方法来从一个对象中获取特定的信息。但是,该对象可以是A类型的,也可以是B类型的。下面是我的代码的一部分: 当我这样写它时,它会引发一个错误,说“重复方法”。我怎么才能让这个起作用?

  • 昨天我想了一个问题,下面是细节: 我有3个JAR文件,a.JAR、b.JAR、c.JAR。这两个JAR文件都有一个名为com.test.test的类,在这个类中定义了sayHello()。

  • 问题内容: 当与MySQL数据库连接时,我有几种方法可以做同样的事情,保存或加载不同类型的参数。目前,我对每种类型都有不同的方法。如何合并这些方法,以便它们支持不同的类型? 下面是两个非常相似但使用不同类型的方法的示例: 请注意,在该示例中,类型均为数字。在类型完全不同的情况下(例如int和String),如何避免使用近乎重复的方法? 问题答案: 您可以在此处应用 策略 模式。 …

  • 问题内容: 之间有什么区别 相对 从技术角度来看。不知道这是否只是SQL Server特定的。 感谢您的回答。 问题答案: 我更喜欢第一个,因为第二个不是便携式的- 是语法错误(至少在SQLite和Oracle中),或者可能无法满足您的期望(比较两列EmployeeName和empName并将比较结果返回为布尔值/整数),而 是相同的 这是我的首选变体。

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定