이것은 실제 코드를 단순화 한 예입니다. 약간의 인위적인 경우 사과드립니다. 내가 뭘하고 싶은지 효과적으로 단일 중첩 형식 인수 중 두 형식 매개 변수를 얻는 것입니다. 나는 이것이 불가능하다고 확신하지만, 나는 그 기회를 줄 것이라고 생각했다.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);
그리고 내 실제 경우를, 내 generics는 때때로
public class Bar implements Baz<String>
과 같은 implements 절에서 지정할 수 있습니다.
두 번째 유형 매개 변수가 내 얼굴에 구현 세부 사항을 던져 버린 것처럼 느끼기 때문에 두 번째 유형 매개 변수가 더욱 고통 스럽다는 것을 지정해야합니다. 말하자면
Foo<Bar,String>
문자열과 바 사이의 관계가 이미있을 때, 그냥 우아하지 않게 보입니다. 나는 그 자바를 얻습니다, 그래서 영토와 함께 간다. 그러나 이것에 대한 해결책이 있는지 궁금해.
팩토리 메서드 아이디어는 흥미 롭습니다. 그러나 내 코드가 항상 같다고 지시하더라도 형식 메서드가 두 번 지정된다는 것은 여전히 귀찮습니다. –
@RusselLeggett, ok, 그러면 불변성이 필요합니다. 콜렉션 super T>'이 필요하지 않습니까? 네. 그것은 고통입니다. 필자의 조언은 라이브러리의 복잡성을 처리하고 반환 형식이'Foo 인 팩토리가 CompleicatedFoo , T>를 확장하여 클라이언트가 단일 매개 변수 버전을 사용할 수 있도록함으로써 간결한 API를 노출하는 것입니다. –