2013-08-15 3 views
1

나는 추상 메소드를 가지고 추상 클래스를 만들려고하는데, 이는 어떤 타입의리스트라도 SuperBean을 확장하는 아이템으로 반환 할 수 있어야한다.추상 수퍼 클래스에서 일반 목록을 정의하는 방법은 무엇입니까?

나중에 목록에 항목을 추가 할 수있는 제네릭 클래스를 만들고 싶습니다. 예 :

class AbstractService<T extends SuperBean> { 
    //this is what I'm aiming for 
    void add(T item) { 
     // "is not applicable for the arguments (T)" 
     superBean.getSublist().add(item); 
    } 
} 

abstract class SuperBean { 
    abstract List<? extends SuperBean> getSublist(); 
} 

class MyBean1 extends SuperBean { 
    List<MyBean2> sublist; 

    List<MyBean2> getSublist() { 
     return sublist; 
    } 
} 

class MyBean2 extends SuperBean { 
    List<MyBean3> sublist; 

    List<MyBean3> getSublist() { 
      return sublist; 
     } 
} 

질문 : 내가 SuperBean의 구현이 어떤 T item를 추가 할 수 있도록 abstract getSublist() 클래스를 정의 할 필요가에 방법?

+1

필드를'List '으로 정의하는 문제는 무엇입니까? 당신이'MyBean2 mb2 = aSuperBean.getItem();'과'MyBean3 mb3 = aSuperBean.getItem();'을 얻고 자하는 것처럼 보입니다. –

+0

아니요 하위 목록에 대해 'MyBean2'와 같은 특정 클래스 유형이 필요합니다. – membersound

+0

이것이 무엇인지 겨냥하고 있는지는 잘 모르겠지만 다음과 같이해볼 수 있습니다 :'public abstract class GenericList ArrayList를 확장합니다 ' –

답변

2

당신은 AbstractService에 제네릭에 추가해야합니다

abstract class SuperBean<T extends SuperBean> { 
    // Now you can define the abstract method properly: 
    abstract List<T> getSublist(); 
} 

각 :

//  Add S to be T's type parameter   Add <S> to SuperBean here 
class AbstractService<S extends SuperBean, T extends SuperBean<S>> { 
    // I'm assuming superBean is defined here. 
    T superBean; 

    //this is what I'm aiming for 
    void add(S item) { 
     superBean.getSublist().add(item); 
    } 
} 

다음, 당신은 그것의 서브 클래스가 제네릭 형식 매개 변수 <T>을 정의하는, SuperBean 제네릭 확인해야합니다 서브 클래스는 제네릭 형식 매개 변수를 적절히 정의합니다.

class MyBean1 extends SuperBean<MyBean2> { 
    List<MyBean2> sublist; 

    List<MyBean2> getSublist() { 
     return sublist; 
    } 
} 
012 3,516,

그리고 MyBean2는 유사하게 정의된다 : 이것은 당신이 원하는 경우

AbstractService<MyBean2, MyBean1> service1 = new AbstractService<MyBean2, MyBean1>(); 
AbstractService<MyBean3, MyBean2> service2 = new AbstractService<MyBean3, MyBean2>(); 
+0

이 접근법의 문제점은'MyBean1'이'SuperBean '를 확장하지 않기 때문에'AbstractService'에서 사용할 수 없다는 것입니다. –

+0

이 작업이 컴파일되고 실행되는 동안,'MyBean2' 인스턴스를'MyBean3'리스트에 추가 할 수 있습니다. –

+0

@LuiggiMendoza 맞아요, 내가 조정할 수 있는지 알 겠어 ... – rgettman

1

일반적인 매개 변수가 여기에 적합하지 않습니다. 당신이 일반적인 유형을 명시 할 경우, 당신은 잘못된거야 위치를 확인할 수 있습니다 : 하위 유형에

abstract class SuperBean<T extends SuperBean> { 
    abstract List<T> getSublist(); 
} 

및 해당 유형 명시합니다 :

SuperBean에 일반 매개 변수를 추가

class MyBean1 extends SuperBean<MyBean2> { 
    List<MyBean2> sublist; 

    List<MyBean2> getSublist() { 
     return sublist; 
    } 
} 

지금, 당신의 서비스에, 당신은

class AbstractService<T extends SuperBean<S>> { 

    void add(T item) { 
     // you cannot do this because the items in the sublist of 
     // your super bean are of the wrong type. 
     superBean.getSublist().add(item); 
    } 
} 

alternativ있을 것입니다

class AbstractService<T extends SuperBean<T>> 

다음으로 하위 목록에 항목을 추가 할 수 있지만 콩은 올바른 유형이 아닙니다. 예를 들어, MyBean1SuperBean<MyBean1>으로 확장되지 않지만 SuperBean<MyBean2>으로 확장됩니다.

0

내가 잘 모르겠지만, 오류를 생성하지 않습니다이 허용

class MyBean2 extends SuperBean<MyBean3> { 
    List<MyBean3> sublist; 

    List<MyBean3> getSublist() { 
      return sublist; 
    } 
} 

다음과 같이 서비스를 선언 할 수 있습니다.

SuperBean과 AbstractService의 두 가지 추상 선언이 있습니다 (AbstractService가 정의되었지만 추상이어야한다고 가정 함).

추상없는 세 가지 선언에서 myBean {1,2,3}이 있습니다

나는 그것이 작동하는지 바로 볼 수 awSuperBean을 정의합니다.

붙여 넣은 코드에 (-grr-concrete) 수퍼 빈즈가 아직 정의되지 않았습니다. 따라서 awSuperBean이라는 superBean을 정의하고이를 (abstract?) add 메소드에서 사용합니다.

. .

/// testing superbean implementation 
// 
class awSuperBean<MyBean1> extends SuperBean { 
    List<MyBean1> getSublist() { return new java.util.ArrayList<MyBean1>(); } 
} 
// 
/// 

class AbstractService<T extends SuperBean> { 

/// tests a superbean definition 
// 
    awSuperBean<T> asuperBean; 

    //this is what I'm aiming for 
    void add(T item) { 
     // "is not applicable for the arguments (T)" 

/// use the superbean 
     asuperBean.getSublist().add(item); 
    } 
} 

/// every defined SuperBean subtype will need to specify the type 
// of SuperBean it will produce in it's getSublist call 
// 
abstract class SuperBean<getSublist extends SuperBean> { 

/// use the type parameter 
// 
    abstract List<getSublist> getSublist(); 
} 

필자는 추상 클래스에서 매개 변수 형식 식별자 T 만 사용해야한다고 생각합니다. Ts를 혼란스럽게하는 대신 superbean 하위 유형 정의에서 선언 된 유형을 사용하십시오.

관련 문제