【问题标题】:How to declare my method to receive any kind of list as argument?如何声明我的方法以接收任何类型的列表作为参数?
【发布时间】:2015-11-07 14:33:40
【问题描述】:
public static int menu(String texto, ArrayList<String> opciones) {
    for (int i = 0; i < opciones.size(); i++) {
        System.out.println((i + 1) + ") " + opciones.get(i));
    }

    return solicitarNumero(texto + " [1-"
            + opciones.size() + "]", true, 1, opciones.size());
}

我有这个方法,它接收一个文本 (texto),提示用户输入一个选项编号和一个带有选项的 ArrayList。 例如{创建条目、删除条目、退出}

solicitarNumero 处理选项号的请求并进行验证。

现在,当我使用不同类(Franquicia、Gerente、Sistema)的变量调用此方法时,我必须检查每个 ArrayList 并创建一个包含该类“toString”的新列表。

像这样

for (Franquicia franquicia : listaFranquicia) {
    listaDatosFranquicia.add(franquicia.toString());
}

然后我将方法与新的 ArrayList 一起使用。

menu("Ingrese el numero de franquicia "
            + "que desea asignar a este control",
            listaDatosFranquicia) - 1));

有什么方法可以简单的做

menu("Ingrese el numero de franquicia "
            + "que desea asignar a este control",
            listaFranquicia) - 1));

无需创建新的 ArrayList?

【问题讨论】:

  • franquicia 已经是Franquicias 的 ArrayList 了吧?

标签: java arraylist


【解决方案1】:

是的。把方法改成

public static int menu(String texto, List<?> opciones) {
    for (int i = 0; i < opciones.size(); i++) {
        System.out.println((i + 1) + ") " + opciones.get(i));
    }

    return solicitarNumero(texto + " [1-"
            + opciones.size() + "]", true, 1, opciones.size());
}

基本上相当于:

public static int menu(String texto, List<?> opciones) {
    for (int i = 0; i < opciones.size(); i++) {
        System.out.println((i + 1) + ") " + opciones.get(i).toString());
    }

    return solicitarNumero(texto + " [1-"
            + opciones.size() + "]", true, 1, opciones.size());
}

除非您的选项之一为 null(在这种情况下,第二个选项将导致 NullPointerException,而第一个选项将打印“null”)。

List&lt;?&gt; 表示:一些未知类型的列表。但是由于所有类型都扩展了 java.lang.Object,并且您只关心对象的 toString() 表示,因此您实际上不需要知道列表的实际泛型类型。

【讨论】:

  • 是的,很好的答案,正是我的想法,但你打败了我;)
  • 太好了,成功了!而不是更改为 List> 我正在尝试 List
【解决方案2】:

不改变方法menu

listaFranquiciaList&lt;Franquicia&gt; 并且该方法需要 List&lt;String&gt;,因此您需要将每个 Franquicia 转换为 String 并使用结果创建一个新列表,与您拥有的代码完全相同。

这有点麻烦,但请注意,使用 Java 8,它可以更简单地写在一行中:

List<String> listaDatosFranquicia = listaFranquicia.stream()
                                                   .map(Franquicia::toString)
                                                   .collect(Collectors.toList());

【讨论】:

  • 这将涵盖这样一种情况,即在未来的某一天,OP 不想再调用 toString,而是使用更具体的方法,例如 getTitle 或其他方法。
【解决方案3】:

我认为您的 menu 方法的更好签名是

public static int menu(final String texto, final List<?> opciones)

这样您可以接受任何类型的对象列表,这将取决于该实例如何实现toString() 方法。

另请注意,我将 ArrayList 更改为 List。尽可能使用接口而不是具体的实现总是更好。

【讨论】:

  • 这不允许传递任何类型的列表。仅列出。 List 不是 List。阅读我的答案。
  • 是的,你是对的,我总是忘记 Java 中的泛型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多