2012-05-14 47 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