2012-08-06 160 views
1
public static <T> T inCache(T obj) throws ClassNotFoundException { 
     String[] token = validateCookie(); //gives me to strings 
     if (token == null) 
      return null; 
     if (Cache.get(token[0]) != null) { 
      if (Cache.get(token[0]).getClass() == Class.forName(token[1]) 
        && obj.getClass() == Cache.get(token[0]).getClass()) { 
       T test = (T) Cache.get(token[0]); 
       return test; 
      } 
     } 
     return null; 
    } 

上面的代碼是完全錯誤的。Java反射/泛型

Basicly我想要做這樣的事情:

  • 我想設置的類在我的功能。例如inCache<User>();
  • 檢查我從緩存中取出的對象是否具有與之前指定的類相同的類。 (obj.getClass == User.class)

  • 如果類匹配,將對象轉換爲類並返回它。 return (User)obj

我想這樣使用它。

User user = inCache<User>(); 

回答

6

至於類簽名,你爲什麼不使用這樣的事情:

public static <T> T inCache(Class<T> clazz) throws ClassNotFoundException { 
    ... 
} 

然後調用它像這樣:

User user = inCache(User.class); 

泛型不能使用

User user = inCache<User>();)由於在運行時類型擦除,即在此種情況下 T的類型在運行時未知。

還要注意的是,使用Class#isAssignableFrom(...)進行測試以便能夠檢查子類也許更好,例如, clazz.isAssignableFrom(Cache.get(token[0]).getClass())。這樣你就可以傳遞一個接口或超類,如果對象是子類型的話,仍然可以獲得匹配。

+0

+1。詳細闡述一下。 。 。而不是'T test =(T)...',那麼你會寫'T test = clazz.cast(...)'。 (請參見http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#cast(java.lang.Object)](http://docs.oracle.com/javase /7/docs/api/java/lang/Class.html#cast%28java.lang.Object%29)。) – ruakh 2012-08-06 14:39:04

+0

@ruakh投給'T'應該也能工作,不是嗎? – Thomas 2012-08-06 14:44:27

+0

非常感謝你:)。這解決了我的問題 – 2012-08-06 14:46:11