【发布时间】:2019-01-20 22:31:39
【问题描述】:
我有一个方法
- 有两个类型参数
T和S,其中S是T的超类, - 有一个
t的实例T作为参数, - 创建一个新实例
sofS, - 用
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());