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;
}
上面的代码是完全错误的。
基本上我想做这样的事情:
- 我想在我的函数中设置类。例如
inCache<User>();
检查我从缓存中取出的对象是否与我之前指定的类相同。
(obj.getClass == User.class)
如果类匹配,则将对象转换为类并将其返回。
return (User)obj
我想这样使用它。
User user = inCache<User>();
最佳答案
至于类签名,你为什么不使用这样的东西:
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())
.这样您就可以传递一个接口(interface)或父类(super class),并且如果该对象属于子类型,则仍然可以获得匹配。
关于Java反射/泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11830395/