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

时间:2016-10-22 19:38:09

标签: 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;
    }

我收到的消息是:“输入安全性:未选中从对象转换为T”。我只是想确保它能正常工作。谢谢。

2 个答案:

答案 0 :(得分:5)

会的。出于遗留原因,Java在集合中使用Object o签名 如果仍然困扰你,请使用@SuppressWarnings("unchecked")

但是,你仍然会遇到很多其他麻烦。

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

答案 1 :(得分:1)

您可以从我能说的所有内容中正确运行您的代码。如果可以,我建议您将方法的声明更改为

@SuppressWarnings("unchecked")

有了这个,您不需要未选中的强制转换,这会使您的代码更简单一些。如果您不能并且在我们说您的代码正确时您相信我们,请使用castToT(Object obj)作为Alexey Soshin说。并考虑将转换分解为单独的方法 <?php if(isset($_GET["type"]) && !empty($_GET["type"]) && $_GET["type"] == 'makereservation'){ //your page makereservation.php code // echo HTML result }else if(isset($_GET["type"]) && !empty($_GET["type"]) && $_GET["type"] == 'addcars'){ //your page addcars.php code // echo HTML result } ?> 或您想要的方法。标签的优点是下次您从编译器或IDE获得友好警告时,您知道它不仅仅是您选择忽略的旧版本。