簡體   English   中英

獲取通用類型或通用實例的類

[英]get class of generic type or generic instance

我有一種方法

  • 具有兩個類型參數TS ,其中ST超類,
  • 有一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM