【问题标题】:How to avoid : " The expression of type List needs unchecked conversion to conform to.."如何避免:“List 类型的表达式需要未经检查的转换才能符合..”
【发布时间】:2016-02-15 05:58:35
【问题描述】:

我有这个代码:

List<Book> bookList = session.createCriteria(Book.class)
                .add(Restrictions.like("name", "%i%")).list();

但是,我有一个通知说: 《类型安全:List类型的表达式需要未经检查的转换才能符合List》

如何修复我的代码以删除此警告?

【问题讨论】:

  • 我猜是因为list() 返回了一个原始列表。

标签: java hibernate list criteria restrictions


【解决方案1】:

将其添加到行上方或方法标题的顶部:

@SuppressWarnings("unchecked")
List<Book> bookList = session.createCriteria(Book.class)
            .add(Restrictions.like("name", "%i%")).list();

或者对于整个方法:

@SuppressWarnings("unchecked")
public void doSomething(){

如果 list() 是你自己的实现,你可以这样定义结果:

private List<Book> list(){
    return new ArrayList<Book>();
  }

那么annotation 不是必需的,您有一个由编译器控制的checked conversion

【讨论】:

  • 它可能会使警告消失,但那里仍然存在未经检查的转换。如果可能,最好修复list()
  • 它的休眠状态。 OP 无法修复它。如果您真的想避免这种情况,您应该将列表中的每一项都转换为所需的类。在 Java 8 中,您可以通过使用流非常轻松地做到这一点。
【解决方案2】:

我修复了这个问题,添加了一个投射列表的方法。

首先将此方法添加到您的类中:

public static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
    List<T> r = new ArrayList<T>(c.size());
    for(Object o: c)
      r.add(clazz.cast(o));
    return r;
}

然后试试这个:

List<Book> bookList = castList(Book.class,
    session.createCriteria(Book.class).add(Restrictions.like("name", "%i%")).list());

【讨论】:

  • 或者你可以使用流:return c.stream().map(clazz::cast).collect(Collectors.toList());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多