2009-05-04 7 views
1

인터페이스 MyThing의 목록 인 인터페이스 MyList를 정의하려고합니다. MyList의 의미 중 일부는 MyThing 인터페이스를 구현하지 않는 객체에서 해당 작업이 의미가 없음을 의미합니다.일반 인터페이스 : 특정 항목의 목록

올바른 선언인가요?

interface MyList<E extends MyThing> extends List<E> { ... } 

편집 : 지금은 그 방법 중 하나로서으로 myList를 반환하는 또 다른 인터페이스를 가지고 (2 부).

// I'm defining this interface 
// it looks like it needs a wildcard or template parameter 
interface MyPlace { 
    MyList getThings(); 
} 

// A sample implementation of this interface 
class SpecificPlace<E extends MyThing> implements MyPlace { 
    MyList<E> getThings(); 
} 

// maybe someone else wants to do the following 
// it's a class that is specific to a MyNeatThing which is 
// a subclass of MyThing 
class SuperNeatoPlace<E extends MyNeatThing> implements MyPlace { 
    MyList<E> getThings(); 
    // problem? 
    // this E makes the getThings() signature different, doesn't it? 
} 

답변

2

네, 적어도 그게 어떻게 EnumSet입니다. 제 2 부에 대답

public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>


편집 :

나는 인터페이스 getThings()의 반환 형식은 원시 유형에 대해 불평하지 않는 이유를 모르겠어요 . 나는 형식 소거 때문에 인터페이스에 경고가 없더라도 반환 할 수 없다고 생각합니다 (반환 유형을 List으로 변경하면 경고가 표시되지 않습니다).

두 번째 질문의 경우 MyNeatThingMyThing으로 확장되므로 E은 해당 범위 내에 있습니다. 그것은 일반적인 매개 변수로 바운드 된 extends을 사용하는 것과 같습니다.

+0

잠깐 기다려 주시겠습니까? 목록은 소비자가 되었기 때문에 우리는 수퍼를 사용해야 했습니까? – willcodejavaforfood

+0

클래스 형식 매개 변수 선언에 super를 사용할 수 없으므로 응답을 알아 내지 못하게됩니다. ;) –

+0

잘 모르겠지만 두 가지 문제를 혼동스럽게 생각합니다. 나는 네가 SomeClass 을 본 적이 있다고 생각하지 않는다. SomeClass 이 ​​타입이 메소드 인자를 지정하는데 사용될 때. http://www.ibm.com/developerworks/java/library/j-jtp07018.html –

1

1 부에 대해서는 제대로 된 것 같습니다.

귀하의 파트 2에 대해 다음과 같이 제안합니다. 이 메소드는 무언가를 MyList으로 반환하는데, 그 내용이 무엇인지 알지 못합니다. (다른 구현에 따라 다릅니다.)하지만 MyThing의 하위 유형이라는 것을 알고 있습니다.

interface MyPlace { 
    MyList<? extends MyThing> getThings(); 
} 
0

는 java.util.List를 같은 구현 인터페이스가 제대로 하드 있음을 유의하십시오; 그래서 다음 질문으로 자신을 모두 물어

  • 나는를 java.util.List를 사용할 수 "있는 그대로", 내가 추가 할 필요가 이/기능을 제거합니까?
  • Iterable처럼 구현할 수있는 것이 더 있습니까? <T>?
  • 작문을 사용할 수 있습니까? (상속)
  • 같은 기존 라이브러리에서 새로 필요한 기능을 찾을 수 있습니까?
  • 기능을 추가/제거해야하는 경우 추가 된 복잡성이 일까요?

즉, java.util을 사용할 수 있습니다.예를 들어 목록 :

interface MyPlace<T extends MyThing> { 
    List<T> getThings(); 
} 

class SpecificPlace implements MyPlace<MyThing> { 
    public List<MyThing> getThings() { return null; } 
} 

class SuperNeatoPlace implements MyPlace<MyNeatThing> { 
    public List<MyNeatThing> getThings() { return null; } 
} 
+0

아, 물론 : 대부분의 경우 내부 전용 목록에 위임 할 것입니다. –

+0

질문은 그것의 목록 ​​측면에 관한 것이 아니라 (List with Foo를 대체하고 내 질문은 동일하게 유지됨) generics 측면에 관한 것입니다. –