这只是我编写的一个示例,旨在简化我的真实代码,所以如果有些牵强,我深表歉意。我想要做的是从单个嵌套类型参数中有效地获取两个类型参数。我很确定这是不可能的,但我想试一试。
//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的特点,但我只是好奇是否有解决方案。
Collection<? super T>
吗?是的。那很烦人。我的建议是在您的库中处理复杂性,并通过具有返回类型interface Foo<T> extends ComplicatedFoo<CollectionSubType<T>,T>
的工厂来尝试公开简洁的API,以便客户端只需使用单个参数版本。 - Mike Samuel