代码之家  ›  专栏  ›  技术社区  ›  Kjara

获取泛型类型或泛型实例的类

  •  0
  • Kjara  · 技术社区  · 8 年前

    • 有两个类型参数 T 和 S S公司 是的超类 T型
    • 有一个实例 t 属于 T型
    • 创建新实例 s 属于 ,
    • 填充的所有字段 内容包括 t型 .

    public static <T extends S, S> S copyAs(T t, Class<S> sClass) {
        S s = sClass.newInstance();
        for (Field f : getAllFields(sClass)) {
            f.setAccessible(true);
            f.set(s, f.get(t));
        }
        return s;
    }
    
    private static Collection<Field> getAllFields(Class<?> cls) {
        Collection<Field> fields = new ArrayList<Field>();
        while (cls != Object.class)
        {
            fields.addAll(Arrays.asList(cls.getDeclaredFields()));
            cls = cls.getSuperclass();
        }
        return fields;
    }
    

    这很管用。

    为了方便起见-如果我想复制同一个类- copyAs(myInstance, MyClass.class) 如果 myInstance 属于类型 MyClass

    我该怎么做?这有可能吗?

    我试过两种方法都不管用:

    public static <T> T copy(T t) {
        return copyAs(t, T.class);
        // error: .class cannot be used on type parameter
    }
    

    和

    public static <T> copy(T t) {
        return copyAs(t, t.getClass());
        // error: t.getClass() gives Class<? extends Object>, not Class<T>
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   lscoughlin    8 年前

    T、 类永远不会工作->您需要进一步阅读java泛型的工作原理。

    这将满足您的需要:

    public static <T> T copy(T t) {
        Class<T> tc = (Class<T>) t.getClass();
        return copyAs(t, tc);
    }
    

    但它确实会引发类强制转换警告——没有办法不使用您想要的代码来实现这一点,请随意抑制它。