이것은 내가 Stackoverflow에 관한 첫 번째 질문입니다. 그래서 내가 뭔가 잘못하고 있다면, 다음 번에 개선 할 수 있도록 말해주십시오.와일드 카드를 자체 유형에 사용하기
Java로 프로그래밍을 한 후 몇 가지 간단한 작업을 수행 한 지 오래되었으므로 아직 많은 기능을 배우지 만이 사이트에서 토론을 읽는 것이 도움이된다는 사실을 알고 있습니다.
나는 다음과 같은 문제에 직면 할 때까지 Generics가 작동하는 방식을 이해할 것이라고 생각했습니다. 나는 그것이 가장 좋은 디자인이 아니거나 다른 방식으로 그것을 해결할 수있는 방법이 있다는 것을 이해하지만, 그렇게해야한다고 해봅시다.
은 (이는 애플리케이션에서 낮은 층으로 의도 된, 그래서 상단 층과 연결을 만들기 위해 제네릭 좋아한다.)
기본 클래스 Identifieable
가 Groupable
의해 확장
상황 클래스 어느
class Group<T extends Groupable> extends Groupable
{
public Group(Id id)
{
super(id);
content = new HashMap<T, Integer>();
}
private final HashMap<T, Integer> content;
// Additional methods for adding, removing etc.
}
: Item
, Mutation
, Location
, 그룹으로 이런 것들로 만든해야한다 등, 내가 추가로 확장 할 수 있습니다
그룹을 항목, 돌연변이 등으로 제한 할 수 있도록 여기에 일반을 추가했습니다. 그룹도 그룹화 할 수 있어야합니다. 나는 다음과 같이 내 Groupable
디자인의 나는 부분입니다있는 그룹을 알 수 원하는대로
는 :
class Groupable extends Identifieable
{
public Groupable(Id id)
{
super(id);
partOf = new ArrayList<Group<? extends Groupable>>();
}
private ArrayList<Group<? extends Groupable>> partOf;
private final ArrayList<Group<? extends Groupable>> containingGroups()
{
return partOf;
}
}
문제
'공범자'의 일반 유형 나를 고통 것입니다. Groupable (물론)을 확장하는 유형의 그룹 목록을 반환해야하며이 객체가 인스턴스 인 간접적으로 클래스를 대체합니다. Mutation은 물론 Items 목록에 포함될 수 없습니다.
그룹화 할 때 유형 매개 변수를 사용하는 것으로 생각했지만 올바른 방법이 아닙니다. 그런 식으로 부모 클래스의 클래스로 클래스를 갖는 Item을 인스턴스화하는 것이 가능합니다.하지만 좋지는 않지만 좋지 않습니다. 이렇게하면 슈퍼 유형의 그룹이 아닌 자체 유형의 그룹을 리턴하고 저장할 수 있습니다.
마지막
이 명확한 경우 나도 몰라, 난 정말 모든 요소를 보존하여 문제를 단순화하는 방법을 모르겠어요.
모든 클래스가 확장되어 "일반적인"방식으로 사용되는 것을 염두에 두는 뛰어난 문제 해결 설계가 존재하는 경우 가능한 많은 감사의 말을 전합니다.
원시 형식을 사용하는 것에 대해 읽었지 만 올바르게 캐스팅되지 않을 것이라고 가정하는 것이 안전하다고해도 올바르게 보이지 않습니다. 와일드 카드로이 일반 중첩과이 특정 문제를 해결하는 올바른 방법으로 Java가하는 일을 설명 할 수 있다면 다시 한 번 감사드립니다.
해결 방법보다 정확한 방법이나 이론적 설명에 더 많은 관심이 있습니다. 구현 방법을 모르므로 아직 오류가 없습니다.
관련 : [? 형태 변수와 현재의 형식을 참조 할 수있는 방법이 있나요 (http://stackoverflow.com/questions/ 7354740/type-with-a-type 변수와 함께 현재 유형을 참조하는 방식입니다. 귀하의 경우에는 여기서 설명하는 솔루션을 권장하지 않습니다. 오히려 다른 그룹을 추적하는 책임을 다른 유형으로 분리하려고 시도하십시오. 그 접근법과 관련한 내 대답은 여기를 참조하십시오 : http://stackoverflow.com/a/17076406/697449 –