2012-08-06 214 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