Это пример, который я составил для упрощения моего реального кода, поэтому я прошу прощения, если он немного надуманный.То, что я хотел бы сделать, это эффективно получить два параметра типа из одного аргумента вложенного типа.Я почти уверен, что это невозможно, но я подумал, что смогу это сделать.
//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>
При необходимости указать этоПараметр второго типа еще более болезненен, потому что кажется, что он бросает детали реализации в мое лицо.То, что говорить «1013 *
Foo<Bar,String>
», когда уже есть отношения между Стрингом и Баром, кажется просто неуравновешенным.Я понимаю, что это Java, так что это идет с территорией, но просто любопытно, было ли решение для этого.