获取通用类型或通用实例的类

时间:2018-08-14 06:39:01

标签: java class generics types

我有一种方法

  • 具有两个类型参数TS,其中ST的超类,
  • 有一个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>
}

1 个答案:

答案 0 :(得分:1)

T.class将永远无法工作->您需要更多阅读有关Java泛型如何工作的信息。

这将满足您的要求:

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

但它确实会引发类强制转换警告-确实没有一种方法可以不对所需的代码执行此操作,请随时对其进行抑制。