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

上面的代码是完全错误的。

基本上我想做这样的事情:

  • 我想在我的函数中设置类。例如inCache<User>();
  • 检查我从缓存中取出的对象是否与我之前指定的类相同。(obj.getClass == User.class)

  • 如果类匹配,则将该对象强制转换为该类并返回它。return (User)obj

我想像这样使用它。

User user = inCache<User>();
4

1 回答 1

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()). 这样,如果对象是子类型,您可以传递接口或超类,并且仍然获得匹配。

于 2012-08-06T14:37:29.173 回答