警告:类型安全:未选中从对象转换为PK

时间:2012-05-14 17:18:46

标签: java object warnings

如何从“id = (PK) m.invoke(obj, (Object []) null);

中删除警告
    private PK getId(T obj) {
    PK id = null;
    for (Field f : type.getDeclaredFields()) {
        if (f.getAnnotation(Id.class) != null) {
            String name = f.getName();
            String method = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
            try {
                Method m = type.getDeclaredMethod(method, (Class<?>) null);
                id = (PK) m.invoke(obj, (Object []) null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return id;
}

3 个答案:

答案 0 :(得分:2)

我假设PK是你班级的通用类型

class MyClass<PK> {

由于Java类型擦除,PK类型在运行时不可用。但是,如果您在构造函数中接受Class<PK>实例,那么您可以通过调用klass.cast(...)来解决此问题

class MyClass<PK> {
    private final Class<PK> keyClass;
    MyClass(Class<PK> keyClass) {
         this.keyClass = keyClass;
    }

    PK getKey() {
        return keyClass.cast(...);
    }
}

如果由于某种原因你无法获得对PK的实际运行时类型的引用,那么你几乎没有办法来抑制警告。

答案 1 :(得分:0)

Method#invoke会返回Object,因此您只有两种方法可以摆脱警告:

  • id声明为Object
  • 在方法声明之前添加@SuppressWarnings("unchecked")

答案 2 :(得分:-1)

添加

@SuppressWarnings("unchecked")

在方法声明之前