我有一个带有返回有界通配符的方法的接口:

public Collection<? extends CacheableObject> retrieveConnections(CacheableObject element);


该接口由返回PersistentAbstraction的类名称CacheableObject实现:

public Collection<? extends CacheableObject> retrieveConnections(CacheableObject element) {
    Collection<CacheableObject> connections = new HashSet<CacheableObject>();
    for(CacheableRelation relation : connectedElements) {
        if(relation.contains(element)) {
            connections.add(relation.getRelatedElement(element));
        }
    }
    return connections;
}


现在,我有一个称为CacheableObjectUser实现和一个具有PersistentAbstraction实例的类。我正在尝试执行以下操作:

public Collection<User> retrieveConnections(User user) {
    Collection<User> collection = (Collection<User>) persistentAbstraction.retrieveConnections(user);
    return collection;
}


但它说:

Type safety: Unchecked cast from Collection<capture#1-of ? extends CacheableObject> to Collection<User>


我不确定该警告背后的原因是什么。用户不是CacheableObject吗?警告是什么意思?

最佳答案

retrieveConnections返回Collection<? extends CacheableObject>。这可能是Collection<User>,但编译器无法知道,因为它可能是Collection<OtherClass>,其中OtherClass是实现CacheableObject的其他类。

有几种方法可以解决此问题。一种方法是使retrieveConnections具有签名的通用方法

public <T extends CacheableObject> Collection<T> retrieveConnections(T element)


(您将需要相应地修改方法的主体)。这样,persistentAbstraction.retrieveConnections(user)的类型将为Collection<User>,并且不需要强制转换。

09-29 20:05