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?
答案 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
。
listaFranquicia
是List<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
更改为列表。在可能的情况下,最好使用接口而不是特定的实现。