Spring Boot 正在获取铸造列表警告,类型安全:从列表中进行未选中的强制转换,这是编写查询的错误方法吗?

l3zydbqr  于 2023-06-22  发布在  Spring
关注(0)|答案(2)|浏览(134)

我是一条越来越黄的线下面的线:

return (List<HealthEntity>) criteria.list();

在下面的代码示例中。警告说:
类型安全:从列表到列表的未选中转换
并建议我使用@SupressWarnings 'unchecked'的方法。

public List<HealthEntity> findByCustomerIds(List<Long> customerId) {
    Criteria criteria = getSession().createCriteria(getPersistentClass());
    criteria.add(Restrictions.in("customerId", customerId));
    if (customerId != null && !customerId.isEmpty()) {
        return (List<HealthEntity>) criteria.list();
    } else {
        return new ArrayList<>(1);
    }
}

这是返回实体列表的正确方法吗?还是我犯了任何错误?我应该使用@SuppressWarnings吗?

whlutmcx

whlutmcx1#

请思考5分钟,并告诉我,下面的代码类型安全吗?

public class Stackoverflow {
    public static void main(String[] args) {
        Stackoverflow sof = new Stackoverflow();
        Cage cage = sof.getCage();
        // are the dogs safe???????
        List<Dog> dogs = (List<Dog>) cage.list();
    }
    public Cage getCage() {
        List cage = new ArrayList<>();
        cage.add(new Lion());
        cage.add(new Dog());
        return new Cage(cage);
    }

    class Cage {
        List cage;
        public Cage(List cage) {
            this.cage = cage;
        }
        public List list() {
            return cage;
        }
    }

    class Animal {
        public void eat() {}
    }
    class Lion extends Animal {
        public void eat() {
            System.out.println("eat the animals around");
        }
    }
    class Dog extends Animal {
        public void eat() {
            System.out.println("eat bones");
        }
    }
}

五分钟后。
狗不安全,因为狮子关在笼子里。
由于使用了原始类型(List),泛型特性丢失,并且无法在编译时检查。错误将留在代码中,并在运行时泄漏(即狗被狮子吃掉)
当您可以确保集合中的数据是安全的时,就可以使用@SupressWarnings来忽略编译时检查。
例如,如果您的getCage方法是这样写的,您可以保证类型安全

public Cage getCage() {
    List cage = new ArrayList<>();
    cage.add(new Dog()); // Here, instead of putting a lion in a cage, a dog is put in a cage
    cage.add(new Dog());
    return new Cage(cage);
}

对于你的代码,我认为它是安全的。只需使用@SupressWarnings来忽略编译时检查。
createCriteria(getPersistentClass())方法应该保证这一点。前提是getPersistentClass()的返回值为HealthEntity.class

mdfafbf1

mdfafbf12#

真的没有别的好办法可以解决这个问题。您无法执行instanceof检查,因为类型擦除并且Criteria#list()的签名使用原始类型。您唯一能做的就是对结果列表中的每个项目运行instanceof检查,但是在这种情况下,信任框架只返回符合您条件的对象是合理的。此外,检查每个项目仍然不会摆脱unchecked警告。所以@SuppressWarnings是正确的。

相关问题