如何声明我的方法接收任何类型的列表作为参数?

时间:2015-11-07 14:33:40

标签: java arraylist

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?

3 个答案:

答案 0 :(得分:3)

是。将方法更改为

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,而第一个将打印&#34; null&#34;)。

List<?>表示:某种未知类型的列表。但是因为所有类型都扩展了java.lang.Object,而你关心的只是对象的toString()表示,所以你真的不需要知道列表的实际泛型类型。

答案 1 :(得分:1)

并非不改变方法menu

listaFranquiciaList<Franquicia>,该方法需要List<String>,因此您需要将每个Franquicia转换为String,然后使用结果,完全符合你的代码。

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

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

答案 2 :(得分:-2)

我认为menu方法的签名要好得多

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

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

另请注意,我已将ArrayList更改为列表。在可能的情况下,最好使用接口而不是特定的实现。