我在这里遇到了泛型问题。有人可以在下面的陈述中指出我所遗漏的内容吗?
1
warning: [unchecked] unchecked conversion
List<Question> qList = (List) session.getAttribute("qList");
^
required: List<Question>
found: List
2
warning: [unchecked] unchecked conversion
List<ExamSchedule> eList = new <ExamSchedule>ArrayList();
required: List<ExamSchedule>
found: ArrayList
我不想压制警告。任何建议将不胜感激。
答案 0 :(得分:8)
List<Question> qList = (List) session.getAttribute("qList");
session.getAttribute("qList");
将返回Object
类型的实例。所以你需要明确地施展它。
(List)
只是原始类型,List<String>
是泛型类型,因此尝试将原始类型转换为泛型类型引用会发出警告。
现在,如果你这样做:
List<Question> qList = (List<Question>) session.getAttribute("qList");
强制转换是一个运行时检查,但在运行时会有一个类型擦除,所以List<String>
和List<Foo>
之间实际上没有区别等等。你得到那个错误。
因此,请尝试(List<?> list)
此类型转换验证对象是List
,而不关心其中所包含的类型。
List<ExamSchedule> eList = new <ExamSchedule>ArrayList();
这是语法错误。它应该是ArrayList<ExamSchedule>
,而不是<ExamSchedule>ArrayList
。
建议:
List<?> qList = (List<?>) session.getAttribute("qList");
List<ExamSchedule> eList = new ArrayList<ExamSchedule>();
答案 1 :(得分:4)
答案1:
List<Question> qList = (List<Question>) session.getAttribute("qList");
答案2:
List<ExamSchedule> eList = new ArrayList<ExamSchedule>();
首先抓住Generics的想法。
至于第一个答案,如果您正在使用HttpSession
,则无法在不使用@SuppressWarnings
注释您的语句的情况下平息警告:
@SuppressWarnings("unchecked")
List<Question> qList = (List<Question>) session.getAttribute("qList");
这是因为Servlet API从Object
返回HttpSession.getAttribute()
。编译器会警告您类型安全(从Object
到List<Question>
未经检查)。
答案 2 :(得分:3)
Java没有具体化的泛型;列表在运行时不携带其元素的类型。因此,试图施放到有界类型会给你一个警告;您可能认为您知道类型,但编译器会提醒您可能是错误的。
你可以转换为未绑定的集合,然后检查每个元素的类型。
List<?> tmp = (List<?>) session.getAttribute("qList");
if (tmp != null) {
for (Object o : tmp) {
Question q = (Question) o;
/* Use q ... */
}
}
如果需要List<Question>
传递给某个API,可以将元素复制到循环内新的,正确声明的列表中。显然,这是一个很混乱,你应该考虑到一个实用方法。但为了使其灵活,您可能希望使用动态类型转换。
public static <T> List<T> asList(Collection<?> c, Class<? extends T> type) {
if (c == null)
return null;
List<T> list = new ArrayList(c.size());
for (Object o : c)
list.add(type.cast(o));
return list;
}
List<Question> qList = asList((Collection<?>) session.getAttribute("qList"), Question.class);
There are methods in java.util.Collections
几乎你需要的东西;不幸的是,他们没有检查原始包装集合中的元素类型。此外,由于它们包装底层集合而不是创建新的独立集合,因此它们仍然可以创建类型错误。
幸运的是,第二个问题很简单:
List<ExamSchedule> eList = new ArrayList<>();
答案 3 :(得分:0)
这可以帮助:-
/Users/tadtab/src/main/java/com/tadtab/dao/ProductDAO.java:[73,66] [unchecked]未经检查的转换
[ERROR] required: List<Product>
[ERROR] found: List
发生什么事了,我的代码
List<Product> productList = session.createQuery("from Product").list());
在这种情况下,不能保证右手声明会返回 列出产品
所以我通过以下方式进行了修改
List<Product> productList = (List<Product>)session.createQuery("from Product").list());
,又出现了另一个编译错误!在日食时是警告。 设置未经检查的演员表
我正在使用Java 12,但仍不确定为什么它是错误而不是警告
解决方案:
最后我必须使用Wilcard类型
List<?> productList = session.createQuery("from Product").list());
并在上添加显式强制转换 这样的列表元素
for(Object obj: productList){
Product product = (Product)obj;
// do something on product
}