簡體   English   中英

為什么Java varargs不支持集合?

[英]Why doesn't Java varargs support collections?

在我的Java代碼中,我經常使用非常方便的method(Class... args) varargs。 據我所知,它們允許您傳遞任意數量的Class對象或Class[]數組。 由於我也經常使用Java集合類,因此兩者之間缺乏兼容性使我感到沮喪。 結果,我最終做了collection.toArray() ,但這有一些類型安全問題。

所以現在問題是:為什么Java不允許Iterable<T>實例作為vararg參數,只要泛型類型適合vararg的T...類型? 不是每個人都一直使用列表,集等嗎? 是否有一種簡單,類型安全的方式來提供從集合到vararg的轉換?

原因很簡單:變量arity參數只是一個老派數組參數,帶有一些額外的元數據,告訴編譯器提供一些語法糖(即,它允許隱式數組創建)。

因此,從JVM Object...的角度來看Object...Object[]幾乎相同。 同樣允許集合需要對JVM進行更具侵入性的更改(迄今為止還沒有明確支持集合)。

請注意,如果您想支持這兩種方式,那么制作基於集合的方法可能是更好的方法:

public void frobnicate(Object... args) {
  frobnicate(Arrays.asList(args));
}

public void frobnicate(Iterable<Object> args) {
  // do stuff
}

這樣做的原因是使用Arrays.asList() 通常Collection.toArray()更便宜的操作(因為它創建了一個簡單的包裝器)。

暫無
暫無

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

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