public static void updateCustomers(List custList) {
Iterator itr = custList.iterator(); // line 1
// other stuff
}
以上代码在第1行显示警告信息,即
迭代器是原始类型。对泛型类型迭代器的引用 应该参数化
为了减轻警告我有两个选择
选项1: -
public static void updateCustomers(List<Object> custList) {
Iterator<Object> itr = custList.iterator(); // line 1
// other stuff
}
1选项: -
public static void updateCustomers(List<?> custList) {
Iterator<?> itr = custList.iterator(); // line 1
// other stuff
}
这两个选项都成功消除了警告消息,但我的问题是哪一个更好,为什么?
更新: -
我最同意
public static void updateCustomers(List<CustomerInfo> custList) {
Iterator<CustomerInfo> ite = custList.iterator(); // line 1
// other stuff
}
但是custList并不总是包含CustomerInfo。
答案 0 :(得分:2)
OP更新中的代码是:
public static void updateCustomers(List<CustomerInfo> custList) {
Iterator<CustomerInfo> ite = custList.iterator(); // line 1
// other stuff
}
然后OP说:
但是custList并不总是包含CustomerInfo。
那么,custList
可能包含一些与CustomerInfo
无关的任意类型吗?如果是这样,那么声明参数List<?> custList
可能是最好的。来自迭代器的元素将为Object
,您必须进行instanceof
检查和向下转换才能使用它们。
另一方面,custList
是否包含某些特定子类型CustomerInfo
的元素?如果是后者,则可以使方法本身具有通用性,如下所示:
public static <T extends CustomerInfo> void updateCustomers(List<T> custList) {
Iterator<T> ite = custList.iterator(); // line 1
// other stuff
}
答案 1 :(得分:0)
这样更好:
public static void updateCustomers(List<Customer> custList) {
Iterator<Customer> ite = custList.iterator(); // line 1
// other stuff
}
答案 2 :(得分:0)
我相信其他人可以更好地解释这一点,但要说明一点:如果你没有定义一个类型,编译器必须弄清楚他正在处理哪种类型。因此,如果您定义了类型安全类型。顺便说一句,对象仍然太笼统,你有没有一个名为Customer的类?
编辑:如果您有两个不同类型的列表,那么我建议您做什么:
public static void updateCustomers(ArrayList<CustomerInfo> custList, ArrayList<Whatever> whateverList) {
Iterator<CustomerInfo> ite = custList.iterator(); // line 1
Iterator<Whatever> iterator = whateverList.iterator(); // line 2
// other stuff
}
答案 3 :(得分:0)
您是否考虑过将参数设置为参数化?
public static <T> void updateCustomers(List<T> custList) {
Iterator<T> ite = custList.iterator();
// other stuff
}