현재 시뮬레이션 프로젝트의 클래스 계층 구조를 설계하고 있습니다. 이것은 Element
인스턴스 트리의 개별 이벤트 시뮬레이션입니다. 간결성을 위해 (그리고 나는 단지 문제의 generics 부분에만 관심이 있기 때문에) 여기서 클래스/인터페이스의 스케치를 제시 할 것이므로 구문이 완벽하지는 않을 것이다. 시작하는 뭔가를하기 위해, 요소는 다음과 같습니다Generic을 사용하여 컨테이너 제한
public abstract class Element {
private Set<Element> children = new HashSet<Element>();
public Element getContainer();
public Collection<Element> getChildren() {
return Collections.unmodifiableSet(children);
}
public Position getPosition();
protected void add(Element e) { children.add(e); }
protected void remove(Element e) {children.remove(e); }
}
Position
의 정의는 정말 중요하지 않습니다, 그리고 어떤 다른 방법은 어떻게해야되는 것은 자명 나는 희망이다.
public abstract class Solid extends Element {
public Size getSize();
}
가 다시 Size
의 정확한 의미는 중요하지 않습니다하는 Solid
단지 시뮬레이션 세계의 공간을 채우는 물리적 객체 있어야하는데 : 우리가 풀에 다른 인터페이스를 던져 상황이 약간 흥미로운 확인하십시오.
public abstract class Stack extends Solid {
public void add(Solid s); // <- trouble ahead!
}
을 그리고 여기에 문제가 시작 어디 : 지금 우리가 가지고있는 것을 우리가 여기에, 서로의 위에 그들을 스택 할 수 있습니다 고체 객체는 Stack
입니다. Solid
의 인스턴스 만 Stack
에 추가하려고합니다. 크기가없는 객체를 쌓기가 어렵 기 때문에 Stack
에는 Size
이 필요한 항목이 필요합니다. 그러므로 나는이 표현 할 수 있도록 내 Element
재 작업 : 여기
public abstract class Element<E extends Element<?>> {
private final Set<E> children = new HashSet<E>();
public Element<?> getContainer();
public Collection<E> getChildren();
public Position getPosition();
public void add(E e);
public void remove(E e);
}
내 의도가 Element
가 포함 할 수있는 (하위) Element
의 종류에 제한이있을 수 있음을 표현하는 것입니다. 지금까지이 모든 것이 작동합니다. 하지만 지금은 컨테이너에 대한 제한이 필요하다고 느꼈습니다. Element
입니다. 그게 어떻게 생겼어?
public interface Element<E extends Element<?,?>, C extends Element<?, ?>>
아니면이 같은 더 갈 않습니다 나는 이것에 대해 퍼지 조금을 느낄 시작하고, 게임에 더있다
public interface Element<E extends Element<?,C>, C extends Element<E, ?>>
: 거기가
- 은 하나의 컨테이너에서 다른 컨테이너로 요소를 전송하는 "포트"(
Input
및Output
)가 있어야합니다. 나는 이것들에 제네릭 마법을 던져야 할 것이다. - 내 할 일 목록에 모델 용 GUI 편집기가 있습니다. 따라서 런타임에이 체크를 사용할 수있게해야합니다. 그래서 나는 타입 리터럴과 같은 것 같아요
public boolean canAdd(Element<?, ?> e)
편집기에 의존해야합니다. 이 방법은 매우 중요하기 때문에 클래스의final
메서드를 사용하고 싶습니다. 따라서 술취한 개발자는 오전 4시에 잘못 입력 할 수 없습니다. - 서브 클래스가
Element
인 경우에는Collection
클래스를 사용하기로 결정할 수 있습니다. 왜냐하면 일부는LinkedList
이거나 완벽하게 보이기 때문입니다.- 내가 다시 발명 바퀴를 오전 :
그래서 여기 내 질문입니까? 저를 위해 어떤 도서관이 있습니까?
- 제네릭으로이 문제를 해결할 수 있습니까? (대답이 '예'인 경우 : 구현에 대한 몇 가지 힌트를 환영합니다.)
- 조금 지나치게 엔지니어링 될 수 있습니까?
- 이 질문에 더 나은 제목이나 태그가 있습니까? :-)
- 는
여기 당신을위한 생각입니다. Java의 범용 클래스의 목적은, ClassCastException를 막는 것입니다. 마침표. 그것은 그들이 정상적인 방법으로하는 유일한 것입니다. 다른 용도로 사용하려는 경우, 그 방법은 광기가됩니다. – Affe
"그 방법은 광기에있다", 하하 .. 타입 삭제를 이해하기 전에 나는 제네릭으로 모든 종류의 야생 트릭을 시도했지만, 대부분은 제네릭의 창조적 인 사용이 실패 할 운명이라고 배웠다. 요소처럼 C가 미친 것처럼 보이면 C는 요소 을 확장합니다> 이러한 요소를 사용하는 것에 회의적이어야합니다. 이러한 용도를 개념화하는 것은 너무 어렵습니다. –
@Affe 여기서 내가하려고하는 목적은 궁극적으로 CCE를 예방하는 것입니다. getSize()가있는 요소에서만 작동 할 수있는 스택에 대해 생각해보십시오. 이는 솔리드입니다. 따라서 제네릭을 사용하여이를 표현하면 컴파일러는 이것이 정상인지 확인합니다. 그렇지 않으면 캐스팅이 유효한지 확인하기 위해 캐스팅하고 다른 방법을 찾아야합니다. – Waldheinz