2012-05-14 42 views
0

我怎样才能把 “id = (PK) m.invoke(obj, (Object []) null);警告:类型安全:未选中从对象转换为PK

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; 
} 

回答

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

警告方法声明之前加入

@SuppressWarnings("unchecked") 

0

Method#invoke返回Object所以你只有2种方法可以摆脱这种警告:

  • 声明idObject
  • 在方法声明之前添加@SuppressWarnings("unchecked")
+0

它返回一个PK,所以你不能声明ID作为一个对象 – unnamed

+0

我很确定一个PK也是一个对象... – assylias