Java反射/泛型

标签 java generics reflection

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/

相关文章:

reflection - 如何在 kotlin 中访问对象声明的对象成员

java - 在 ArrayList 中搜索对象

c# - 我怎样才能改进这个设计?

c# - 为什么我不能将 Foot?> 转换为 Foot>

.net - 修改并运行现有的 .NET 程序集而不保存到磁盘

c# - c#中构造函数参数的名称

java - Java 如何像 C 那样写/读硬件端口? (outb、inb 等..)

java - LibGdx : Using setInputProcessor(stage) in different classes

java - 无法在 Clojure 中调用 createTempDirectory

c++ - 模板函数以外的 OCaml 多态性示例?