java @SuppressWarnings的语法("未经检查"),继承了泛型类型

时间:2017-11-22 11:04:04

标签: java generics suppress-warnings unchecked

我的课程定义如下,其中包含一些方法

public abstract class Pojo<T extends Pojo<T, U>, U extends Phase<U>> {
    ...
    public T updatePhase(U phase) {
        this.previousPhase = this.phase;
        this.phase = phase;
        return getThis();
    }

    public U getPreviousPhase(U phase) {
        return this.previousPhase;
    }

    @SuppressWarnings("unchecked")
    public T getThis() {
        return (T) this;
    }

    public Map<String, String> getMap() {
        return this.map;
    }
}

public interface Phase<U extends Phase<U>> { ... }

稍后在我的代码中,我尝试执行以下操作:

Pojo pojo = someService.get(id); // This can't be a definite type since I get this by deserializing a string
Phase ap = pojo.getPreviousPhase();
pojo.updatePhase(ap); // I get the unchecked warning here (case 1)
Map<String, String> myMap = pojo.getMap(); // I get the unchecked warning here (case 2)
myMap.put("1", "2"); // This obviously works

案例1:取消选中作为原始类型成员的updatePhase(U)来电。
我理解为什么这会发出警告。在这种情况下如何使用@SuppressWarnings("unchecked")注释(语法方式)?如果我将它组合成单个语句pojo.updatePhase(pojo.getPreviousPhase)

,将如何使用它

案例2:未经检查的转化,必需Map<String,String>,找到Map
为什么要发出警告?我返回了一个明确的类型Map<String, String>所以它不应该关心......同样如何在这里应用@SuppressWarnings注释?同样,我如何在单行语句pojo.getMap().put("1", "2")

中执行此操作

注意:我确实在我的代码中确保所有这些类型的转换都是正确的,并且不会在运行时导致转换错误。

1 个答案:

答案 0 :(得分:1)

使用原始类型禁用泛型类型检查是个坏主意。对于第一个问题,您应该告诉Pojo在内部传递字段值,而不是尝试将未知类型的对象强制转换为未知类型的泛型方法参数:

public T updateFromPrevious() {
    return updatePhase(getPreviousPhase());
}

一旦停止使用原始类型,编译器将停止忽略这些行上的泛型类型,第二个警告将消失:

Pojo<?,?> pojo = someService.get(id);
pojo.updateFromPrevious();
Map<String, String> myMap = pojo.getMap();
myMap.put("1", "2");