类型安全:从Object到T的未选中强制转换(Java)

ana*_*ana 3 java generics

我正在使用键T和值Long创建一个HashMap,我的remove方法(从AbstractCollection类中重写)看起来像这样:

 public boolean remove(Object o) {
    if(denseBag.containsKey(o)){
        if(denseBag.get(o) == 1L){
            denseBag.remove(o);
        } else {
            Long removed = denseBag.get(o);
            T theO = (T) o;
            denseBag.replace(theO, removed, removed--); 
        }
    } else {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

我收到消息:"输入安全性:从对象到T的未选中状态".我只是想确保它能正常工作.谢谢.

Ale*_*hin 6

它会.出于遗留原因,Java在集合中使用Object o signature.
如果这仍困扰你,请使用@SuppressWarnings("unchecked").

不过,你还会遇到很多其他麻烦.

这将被忽略:removed--,使用--removed

  • 未敢苟同.试图从"Map <T,Long>"中删除一个不是"T"的键是没有意义的,因为你事先可以知道它不在那里.在Java 1.4及更早版本中,在泛型之前,`remove(Object)`是必要的; 今天只回写的代码仍然需要它.所以"出于遗产的原因"就是重点. (2认同)