如何从“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;
}
答案 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")
在方法声明之前