警告:[未选中]未经检查的转化

时间:2013-05-10 04:57:52

标签: java

我在这里遇到了泛型问题。有人可以在下面的陈述中指出我所遗漏的内容吗?

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 个答案:

答案 0 :(得分:8)

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

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

  3. 现在,如果你这样做:

    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()。编译器会警告您类型安全(从ObjectList<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
}