[英]get class of generic type or generic instance
我有一種方法
T
和S
,其中S
是T
超類, T
的實例t
作為參數, S
的新實例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)
則該方法應在內部僅調用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>
}
T.class將永遠無法工作->您需要更多閱讀有關Java泛型如何工作的內容。
這將做您想要的:
public static <T> T copy(T t) {
Class<T> tc = (Class<T>) t.getClass();
return copyAs(t, tc);
}
但這確實會引發類強制轉換警告-確實沒有一種方法可以對所需的代碼不執行此操作,可以隨意對其進行抑制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.