【问题标题】:get class of generic type or generic instance获取泛型类型或泛型实例的类
【发布时间】:2019-01-20 22:31:39
【问题描述】:

我有一个方法

  • 有两个类型参数TS,其中ST的超类,
  • 有一个 t 的实例 T 作为参数,
  • 创建一个新实例s of S
  • t的内容填充s的所有字段。

代码如下:

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

这很好用。

为了方便 - 如果我想复制为同一个类 - 我想要第二种方法,只有一个参数。如果myInstance 的类型为MyClass,则该方法应在内部调用copyAs(myInstance, MyClass.class)

我该怎么做?这可能吗?

我尝试了两种都不起作用的方法:

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

【问题讨论】:

  • 用例:我有一堆从 xml 生成的类(在 xml 模式文件上使用 xjc)。它们具有继承层次结构。有时我需要 (1.) 从 xml 中检索一些 T 类型的对象,(2.) 将此对象反序列化/编组为另一个 xml,但不是 T 而是 S(实际上只是扔掉一些数据)。
  • return copyAs(t, t.getClass());

标签: java class generics types


【解决方案1】:

T.class 将永远无法工作 -> 您需要进一步了解 Java 泛型的工作原理。

这会做你想做的事:

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

但它确实会引发类强制转换警告——实际上没有办法不使用您想要的代码执行此操作,请随意取消它。

【讨论】:

  • 它应该是 return copyAs(t, tc) 而不是 return copy(t, tc) 但我无法进行此编辑,因为它需要至少有 6 个已编辑字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多