2011-08-02 4 views
2

모든 모델 클래스에서 특정 update 메서드를 구현하는 응용 프로그램이 있습니다. 이를 위해 나는 abstract class 다음과 같은 선언과 interface을 만들어 : 하위 클래스 선언 제한

public interface BaseInterface<T> 
{ 
    T update(T t); 
} 

public abstract class BaseClass<T extends BaseClass<T>> implements BaseInterface<T> 
{ 

} 

는 따라서 내 모든 모델 클래스가 BaseClass를 확장합니다. 예를 들어, Book 클래스 정의는하지만 내 모델 클래스의 선언을 제한 할 수없는 나는 위의 구조를 사용하여

public class Book extends BaseClass<Book> 
{ 
    public Book update(Book b) 
    { 
     //implementation 
    } 
} 

될 것입니다.

class Book extends BaseClass<User> 
{ 
    public User update(User u) 
    { 
     //implementation 
    } 
} 

을 내가 위가를 제한 할 할 올바른 구문 동안 다음 Book 클래스는, 유효한 다음과 같은 선언을 BaseClass<Book>을 확장하는 예를 들어이 유효하고 요구된다.

기본적으로 내 모델 클래스의 update 메서드는 매개 변수로 자체 클래스의 인스턴스를 가져 와서 자체 클래스의 인스턴스 만 반환하고 나머지는 반환하지 않습니다. BaseClass를 확장하는 클래스 C이있는 경우 즉

는 다음의 update 방법은 정확한 서명 C update(C c)이어야합니다.

또는 다른 말로BaseClass를 확장하는 클래스 C가있는 경우, 다음 BaseClass의 템플릿 매개 변수는 C 자체가 다른 [즉 C extends BaseClass<C>] 아무것도해야합니다.

어떻게 구현합니까?

참고 :이 여기에 우리가 enum 자체 형식의 인스턴스와 enum 아닌 다른 종류를 취할 compareTo 방법의 정의를 제한 할 수있는 enum 선언

public class Enum<E extends Enum<E>> implements Comparable<E> 
{ 
    int compareTo(E e) 
    { 
    } 
} 

다소 유사하다.

미리 감사드립니다.

+1

'BaseInterface'라는 인터페이스를 생성하지 마십시오 하나님의 사랑을 위해, 당신은뿐만 아니라'Zywbxzytdkkenbfd'를 호출 할 수 있습니다하십시오. '업데이트 가능'이라고해야합니다. – Qwerky

+0

나는 나의 질문을 명확하게하기 위해 BaseInterface 인터페이스를 명명했다. 나는 그것을 생산에 사용하지 않을 것이다. –

답변

2

사용자 정의 인터페이스를 interface BaseInterface<T extends BaseClass<T>>으로 변경하십시오.

내 예를 따르십시오 :

public interface BaseInterface<T extends BaseClass<T>> { 
    T update(T t); 
} 

public abstract class BaseClass<T extends BaseClass<T>> implements 
     BaseInterface<T> { 

} 

public class Book extends BaseClass<Book> { 
    @Override 
    public Book update(Book b) { 
     return null; 
    } 
} 

class User {} 

    // This code cannot be compiled exactly for reason you want. 
public class Book2 extends BaseClass<User> { 
    @Override 
    public Book2 update(Book2 b) { 
     return null; 
    } 
} 
+0

나는 위의 코드가 내가 원하는 것을하고 있다고 생각하지 않는다. 'Book2'의 코더는'update' 메소드를'User update (User u)'로 쉽게 리팩토링 할 수 있으며 코드가 컴파일됩니다. 내가 원했던 것은'C' 클래스가 있다면 그 업데이트 메소드는'C update (C c)' –

+0

이되어야한다는 것입니다. 사용자 클래스가 요구 사항을 충족하지 않으므로 코드를 컴파일 할 수 없습니다. BaseClass를 확장하지 않습니다. 따라서 컴파일 오류가 클래스 헤더에 나타납니다. – AlexR

+0

@Swaranga Sarma : 하위 클래스가 특정 메소드를 정의하도록 강제 할 수 있습니다. 다만, 서브 클래스가이 메소드의 오버로드 된 버젼을 정의하는 것을 막을 수 없습니다. – Grodriguez