2013-11-22 9 views
0

고유 한 유형의 요소 만 포함 할 수있는 특수 유형의 컬렉션을 디자인하려고합니다. 이 컬렉션 클래스는 확장 가능해야합니다. 언뜻 보면, 이것은 충분히 간단한 작업처럼 보인다 이러한 컬렉션 중 하나는 그 클래스의 인스턴스 인 요소를 포함 할 수 있기 때문에, 그러나클래스를 항상 확장하는 일반 만들기

public class MyClass<E extends MyClass> implements Collection<E>{ 
    //insert Collection<E> methods here... 
} 

, 가능한 안 다음

public class MySubclass extends MyClass<MyClass>{} 

는 내가 필요로하는 것은 본질적으로 수행 MyClass의 버전입니다 다음 (이 컴파일하려고하지 마십시오) :

public class MyClass<E extends this.getClass()> implements Collection<E>{...} 

그것을 이런 식으로 뭔가를 구현할 수 있습니까? 그렇다면 어떻게 할 수 있습니까?

답변

1

나는 당신이 찾고있는 서명 이런 식으로 뭔가있을 거라고 생각이와

public class MyClass<E extends MyClass<E>> ... 

문제, 나는 당신이 선언의 관점에서 원하는 것을 적용 할 수 있다고 생각하지 않습니다 왜이다 무한 루프가 있습니다. 컬렉션에 자체 유형의 요소 만 포함될 수있는 경우 요소에는 자체 등의 요소 만 포함될 수 있습니다.

이제 컬렉션을 포함 할 수있는 무한 루프가 생기고 언제든지 컬렉션을 가질 수 있습니다 몇 가지가 들어 있습니다.

또한 런타임시 유형 삭제 기능이 모든 제네릭 유형을 제거합니다. 따라서, 상관없이 당신의 일반 선언은 다음을 수행 그냥 경고 얻을 수있는 포인트 누군가 얼마나 멋진 :

new MyClass(); 

아마 잘 작동하지 않습니다 구조의이 유형을 적용하려고 또 다른 이유입니다.

대신 런타임 적용을 제공하는 add 메서드에서 적절한 수표를 사용할 수 있습니다. 그래도 무한 루프 문제가 있습니다.

은 다음과 런타임 검사를 수행 할 편집 :

public boolean add(E element){ 
    if (!(element instanceof MyClass)) 
      throw new IllegalArgumentException("Element is not an instance of MyClass"); 

    // rest of add code here 
} 
+0

은 "무한 루프"와 동일한 유형의 노드의 트리가 요구 될 때 허용 될 수 있습니다. 그리고 새로운 MyClass()는'MyClass'를 추상화함으로써 쉽게 금지 될 수 있습니다. – Holger

+0

WRT 추상,'SubClass는 MyClass {}'를 확장 할 수 있습니다. Java에서는 제네릭을 사용할 필요가 없으며 원시 형식 경고 만 제공합니다. –

+0

+1 (가능한 경우) 서명. MySubclass가 MyClass를 확장하는 것을 허용하지 않습니다. , 올바른 방향으로 나아가 야합니다! 그러나 MySubclass를 확장하면 MyClass가 여전히 수퍼 클래스를 추가 할 수 있습니다 (Object가 아니라 MyClass까지만). 그리고 예, Holger는 정확합니다. 노드의 체인은 정확히 여기서 원하는 것입니다. 컬렉션은 완전히 저장된 유일한 것들입니다. 아마도 런타임에 적용되는 추가 기능이 나에게 유용 할 수 있습니다. 그런 일을하는 법을 보여 주시겠습니까? –

관련 문제