我有一個方法,它將一個集合的元素映射到其他物件,并回傳一個包含映射元素的集合。我希望回傳的集合與輸入的集合具有相同的集合型別,但具有不同的元素型別。 我的方法是這樣的:
我的方法是這樣的
< E extends OriginalElement, T extends TargetElement,
C extends Collection<E>, R extends C< T>> R map(C elementsToMap) {
// snip
}
顯然,R擴展C<T>部分不起作用。
我怎樣才能將該回傳型別指定為與型別C相同的Collection的子類,但是用元素型別T代替E?
uj5u.com熱心網友回復:
你不能,我不認為,因為例如ArrayList<String>和ArrayList<Integer>基本上是不相關的型別。
另外,當你說 "相同的通用集合型別 "時,你的意思是:
這不僅是困難的,因為一般來說,你不知道如何實體化任意的子類,你可能無法創建這樣的實體,例如,如果輸入是一個 IntegerArrayList (extends ArrayList<Integer>),而你想將元素映射到 Strings。因此,雖然你可以在這種情況下回傳一個java.util.ArrayList<String>,但你不能有一個通用的解決方案,因為你需要一些關于 "在這種特定情況下要實體化哪種型別 "的知識。
我將做出一個未經量化的斷言:一小部分集合型別可以處理大多數情況。因此,請為這些特定型別提供多載:
</*型別變數 */> ArrayList<T> map(ArrayList<E> input) { ... }
</*型別變數 */> HashSet<T> map(HashSet<E> input) { ... }
</*型別變數 */> ImmutableList<T> map(ImmutableList< E> input) { ... }
//etc.。
然后為其他情況提供一個通用的方法,并讓呼叫者指定他們想要的集合型別:
。</* type variables */> Stream<T> map(Collection< E> input) { ... }
然后從具體方法中呼叫一般方法:
</* type variables */> ArrayList<T> map(ArrayList<E> input) {
return map((Collection<E>) input).collect(toCollection(ArrayList::new)。
}
//etc.。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318411.html
標籤:
上一篇:在設備/模擬器上不可見約束布局
