2011-08-02 14 views
2

すべてのモデルクラスに特定のupdateメソッドを実装するアプリケーションがあります。サブクラス宣言の制限

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

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

} 

したがって、すべての私のモデルクラスはBaseClassを拡張します。このために私は次の宣言でabstract classinterfaceを作成しました。例えばBookクラス定義は、しかし、私は私のモデルクラスの宣言を制限することはできませんよ上記の構文を使用して

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

になります。私がそれを制限したい上記を行うには構文的に正しいですが

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

:また、有効な次の宣言をBaseClass<Book>を拡張するために有効と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'を呼び出すことができます。それは 'Updateable'と呼ばれるべきです。 – 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

でなければならないということです。 Userクラスが要件を満たしていないため、コードをコンパイルすることはできません。これはBaseClassを拡張しないためです。したがって、コンパイルエラーがクラスヘッダーに表示されます。 – AlexR

+0

@Swaranga Sarma:サブクラスが特定のメソッドを定義するように強制できます。しかし、サブクラスがこのメソッドのオーバーロードされたバージョンを定義するのを防ぐことはできません。 – Grodriguez

関連する問題