這是我編寫的一個例子,它是對我的真實代碼的簡化,所以我很抱歉,如果它是有點人爲的。我想要做的是從單個嵌套類型參數中有效獲取兩個類型參數。我很確定這是不可能的,但我認爲我會試一試。Java中的嵌套類型參數
//Not legal java code
public class Foo<C extends Collection<T>> { //where T is another type parameter
private C coll;
public Foo(C coll) {
this.coll = coll;
}
public void add(T elem){
this.coll.add(elem);
}
//UPDATED TO ADD GETTER
/**
* I may need to retrieve the collection again, or pass it
* on to another function that needs the specific C type
*/
public C getColl(){
return coll;
}
}
...
List<String> strings = new ArrayList<String>();
Foo<List<String>> foo = new Foo<List<String>>(strings);
foo.add("hello");
我知道我可以通過添加其他類型的參數做到這一點:
public class Foo<C extends Collection<T>,T>
但我必須添加冗餘:
Foo<List<String>,String> foo = new Foo<List<String>,String>(strings);
在我的現實世界的情況下,我的泛型有時可以在implements子句中指定,如
public class Bar implements Baz<String>
不得不指定第二個類型參數更加痛苦,因爲它感覺就像在我的臉上拋出實現細節。不得不說
Foo<Bar,String>
當String和Bar之間已經存在關係時,只是看起來不夠雅緻。我得到它的Java,所以隨着領土,但只是好奇,如果有這個解決方案。
工廠方法的想法很有趣,但它仍然困擾我,該類型被指定兩次即使我的代碼指出,他們總是相同的。 –
@RusselLeggett,好的,所以你需要不變性然後,沒有'收集 super T>'?是的。這是一個痛苦。我的建議是處理庫中的複雜性,並嘗試通過讓返回類型爲「interface Foo」的工廠擴展ComplicatedFoo ,T>'以便客戶端可以使用單參數版本。 –