强制转换不可修改的 Collection< 是否安全?将 T> 扩展为 Collection<T>

Ern*_*ael 1 java generics

我正在使用一个旧的 API,它有一个返回 Collection<? 扩展 T>; API 表示返回的结果是不可修改的。根据《Effective Java》,返回有界通配符被认为是不好的形式。我已经实现了一个包装函数,因此新代码看起来很干净。确实如此

    Collection<? extends T> c0 = oldAPI();
    Collection<T> c = (Collection<T>)c0; // "unchecked cast" warning
    return c;
Run Code Online (Sandbox Code Playgroud)

演员阵容在所有情况下都“安全”吗?最多?如果不是,有什么例子吗?

看起来演员阵容是安全的,并且经过有限的测试,一切都按预期进行。A@suppressWarnings("unchecked")避免发出警告。

也许安全的原因是返回的集合是不可修改的。

Lou*_*man 5

安全的,因为集合是不可修改的。也就是说,有一种巧妙而简单的方法可以利用这一点:

Collection<T> c = Collections.unmodifiableCollection(c0);
Run Code Online (Sandbox Code Playgroud)

...这实际上强制了不可修改性并允许您以这种方式向上转换。