簡體   English   中英

Java 添加到未知類型泛型列表

[英]Java adding to a unknown type generic list

我在 Java 中遇到了以前從未遇到過的事情,也就是說,我需要創建一個新實例,例如 ArrayList class,然后在運行時添加數據而不分配已知類型。 這聽起來有點模糊,所以這里是一個例子:

Class<?> c = i.getClass();

Constructor<?> con = ArrayList.class.getConstructor();
ArrayList<?> al = (ArrayList<?>)con.newInstance();

al.add("something");

現在我這樣做而不是僅使用 generics 的原因是因為 generics 已經被大量使用,並且此示例中的“i”變量將被用作類型“?”。 我真的寧願不使用另一個泛型,因為這會給用戶帶來更多的工作,並且最終設計的靈活性會大大降低。 有沒有辦法使用類似下面的東西(注意:下面的東西不起作用)。 有人有想法嗎?

ArrayList<c> al = (ArrayList<c>)con.newInstance();

您不能在使用通配符 generics 定義的集合中添加對象。 這個線程可能會幫助你。

實際上,您正在創建一個集合,是的,每個集合的超類型,因此可以分配給 generics 的任何集合; 但是它太通用了,不允許任何類型的添加操作,因為編譯器無法檢查您添加的內容的類型。 這正是 generics 的目的:類型檢查。

我建議您閱讀該主題並查看它是否也適用於您想要做的事情。

您的集合太通用,無法添加任何內容。問題與分配的右側無關(使用 singleton 或反射),它位於使用通配符的左側聲明類型中。

如果我明白你的意思,你有一個 class C,它在編譯時是未知的,你想以一種類型安全的方式創建一個ArrayList<C> 這個有可能:

Class<?> c = ...;
ArrayList<?> al = listOf(c);

static <T> ArrayList<T> listOf(Class<T> clazz)
{
    return new ArrayList<T>();
}

這是理論上正確的做法。 但誰在乎。 我們都知道類型擦除,並且 Java 不會刪除類型擦除並為類型參數添加運行時類型。 因此,只要您知道自己在做什么,您就可以使用原始類型並自由轉換。

你可以只使用ArrayList<Object> ,你可以add()任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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