8

我在这里面临泛型问题。谁能指出我在以下陈述中遗漏了什么?

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

我不想压制警告。任何建议将不胜感激。

4

4 回答 4

10
List<Question> qList = (List) session.getAttribute("qList");
  1. session.getAttribute("qList");将返回类型的实例Object。所以你需要明确地转换它。

  2. (List)只是原始类型,List<String>是泛型类型,因此尝试将原始类型转换为泛型类型引用会发出警告。

现在,如果你这样做:

List<Question> qList = (List<Question>) session.getAttribute("qList");

强制转换是运行时检查,但在运行时会有类型擦除,因此 aList<String>List<Foo>etc 之间实际上没有区别。因此您会收到该错误。所以尝试(List<?> list)这种类型转换验证对象是 aList而不关心其中包含的类型。

List<ExamSchedule> eList = new <ExamSchedule>ArrayList();

那是语法错误。应该是ArrayList<ExamSchedule>,不是<ExamSchedule>ArrayList

建议:

List<?> qList = (List<?>) session.getAttribute("qList");
List<ExamSchedule> eList = new ArrayList<ExamSchedule>();
于 2013-05-10T05:01:11.163 回答
5

答案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 返回一个Objectfrom HttpSession.getAttribute()。否则编译器会警告您类型安全(未经检查的从Objectto强制转换List<Question>)。

于 2013-05-10T05:01:57.713 回答
3

Java 没有具体化的泛型;该列表在运行时不携带其元素的类型。因此,尝试转换为有界类型会给你一个警告;您可能认为您知道类型,但编译器会提醒您这可能是错误的。

可以强制转换为未绑定的集合,然后检查每个单独元素的类型。

List<?> tmp = (List<?>) session.getAttribute("qList");
if (tmp != null) {
  for (Object o : tmp) {
    Question q = (Question) o;
    /* Use q ... */
  }
}

如果您需要将 aList<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);

有一些方法java.util.Collections几乎可以满足您的需要;不幸的是,他们不检查原始包装集合中的元素类型。此外,由于它们包装了基础集合而不是创建新的独立集合,因此它们仍然可能产生类型错误。

幸运的是,第二个问题很简单:

List<ExamSchedule> eList = new ArrayList<>();
于 2013-05-10T05:35:32.937 回答
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 Products

所以我通过以下方式进行了修改

 List<Product> productList = (List<Product>)session.createQuery("from Product").list());

并得到另一个 Got 编译错误!在日食上,这是一个警告。说明未经检查的演员表

我正在使用 java 12,但仍然不确定为什么它是错误而不是警告

解决方案:

最后我必须使用 Wilcard 类型

List<?> productList = session.createQuery("from Product").list());

并像这样在 List 的元素上添加显式转换

for(Object obj: productList){

    Product product = (Product)obj;
  // do something on product
} 
于 2019-07-19T06:53:07.833 回答