2014-01-24 2 views
1

이것은 내가 Stackoverflow에 관한 첫 번째 질문입니다. 그래서 내가 뭔가 잘못하고 있다면, 다음 번에 개선 할 수 있도록 말해주십시오.와일드 카드를 자체 유형에 사용하기

Java로 프로그래밍을 한 후 몇 가지 간단한 작업을 수행 한 지 오래되었으므로 아직 많은 기능을 배우지 만이 사이트에서 토론을 읽는 것이 도움이된다는 사실을 알고 있습니다.

나는 다음과 같은 문제에 직면 할 때까지 Generics가 작동하는 방식을 이해할 것이라고 생각했습니다. 나는 그것이 가장 좋은 디자인이 아니거나 다른 방식으로 그것을 해결할 수있는 방법이 있다는 것을 이해하지만, 그렇게해야한다고 해봅시다.
은 (이는 애플리케이션에서 낮은 층으로 의도 된, 그래서 상단 층과 연결을 만들기 위해 제네릭 좋아한다.)
기본 클래스 IdentifieableGroupable 의해 확장

상황 클래스 어느

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가하는 일을 설명 할 수 있다면 다시 한 번 감사드립니다.

해결 방법보다 정확한 방법이나 이론적 설명에 더 많은 관심이 있습니다. 구현 방법을 모르므로 아직 오류가 없습니다.

+1

관련 : [? 형태 변수와 현재의 형식을 참조 할 수있는 방법이 있나요 (http://stackoverflow.com/questions/ 7354740/type-with-a-type 변수와 함께 현재 유형을 참조하는 방식입니다. 귀하의 경우에는 여기서 설명하는 솔루션을 권장하지 않습니다. 오히려 다른 그룹을 추적하는 책임을 다른 유형으로 분리하려고 시도하십시오. 그 접근법과 관련한 내 대답은 여기를 참조하십시오 : http://stackoverflow.com/a/17076406/697449 –

답변

1

Groupable 클래스에 그룹 모음을 포함하도록 지정할 수 없습니다.주된 이유는 Groupable 클래스가 Groupable을 확장하기 때문에 Groupable 클래스가 컴파일 될 때 알 수 없다는 것입니다.

여기 다른 문제는 실제로 (나에게) 이해가되지 않는다는 것입니다. 예를 들어, Groupable 클래스가 Item 클래스에 의해 확장되면 어떻게 될까요? 그것이 기본적으로 형제가 될 것이라는 점을 고려하여 집단 집단을 포함하는 것이 합리적일까요? 그러나 그것들을 연결시키는 유일한 것은 공통의 부모입니다.

내가 코드 이런 식으로 수정 제안

:

class Groupable extends Identifiable 
{ 
    private ArrayList<? extends Groupable> partOf; 

    public Groupable(String id) 
    { 
     partOf = new ArrayList<Groupable>(); 
    } 


    private final ArrayList<? extends Groupable> containingGroups() 
    { 
      return partOf; 
    } 
} 
+0

나는 당신의 의견에 귀를 기울여야한다. 나는 당신과 의견이 다른 순간에 다른 클래스를 가질 수있다. 인스턴스 변수 imho, 부모, 자식, 아무것도,하지만 내가 말했듯이, 나는 이것을 조사 할 것이다. 둘째로, 당신이 말하는 감각은 아이템이 어떤 그룹인지 알 수 있다는 것입니다. 내가 몇 가지 다른 것들을 포장하고 봉인하고 하나의 그룹으로 만든 물건. 이 그룹은 다른 그룹, 팔레트 또는 이와 유사한 다른 항목으로 다시 포장되어 이동, 선적되는 식으로됩니다. 또 다른 솔루션은 모든 그룹을 검색하지 않고 지식을 제공하는 관리자입니다. – RinusHoog

+1

@RinusHoog 왜 부모와 관련하여 자녀와 관련된 특정 정보가 있습니까? OOP의 오용 인 것 같습니다. – user3230483

관련 문제