我有一种方法
T
和S
,其中S
是T
的超类,t
的实例T
作为参数,s
的新实例S
,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>
}
答案 0 :(得分:1)
T.class将永远无法工作->您需要更多阅读有关Java泛型如何工作的信息。
这将满足您的要求:
public static <T> T copy(T t) {
Class<T> tc = (Class<T>) t.getClass();
return copyAs(t, tc);
}
但它确实会引发类强制转换警告-确实没有一种方法可以不对所需的代码执行此操作,请随时对其进行抑制。