ジェネリックを使用して、複合階層のサブタイプを制限できるようにして、階層の異なるレイヤーで異なるタイプを強制できるようにしています。
たとえば、(Business:Division:Department:Group:Person) 階層がある場合、各レベルの複合ノードは適切なタイプ (階層内の次の下位レベル) の子ノードのみを受け入れます。したがって、次の下位レベルからのノードのみを受け入れるようにインスタンス化された各レベル タイプでジェネリックを使用して、コンポジット内のレベルを構築します。
しかし、ジェネリックでエラーが発生しました。それが設計エラーを示しているのか、それとも単に Java ジェネリックではできないことを示しているのかわかりません。アイデアは有効に思えます。構造のレベルを強制するために、階層内の特定の次のレベルからのサブタイプのみを受け入れるように add() メソッドによって受け入れられる型を制限したいだけです。各段階で型の上限を下げているだけなので、リストに送信されたすべてのメッセージは引き続き有効です。
典型的な GOF 複合パターンの最上位ノード:
public abstract class Business { ... }
複合ノード階層の最上位:
public abstract class Group extends Business {
protected List<Business> subs; // composite links
public Group add(Business comp) {
subs.add(comp);
return this;
}
複合階層の後続のレベル:
public class Area<T extends Business> extends Group {
protected List<Business> subs; // composite links
public Area(String title){
super(title);
subs = new ArrayList<Business>();
}
@Override
public Group add(T comp) { // ** Error Here **
super.add(comp);
return this;
}
エラーは次のとおりです。
Multiple markers at this line - The method add(T) of type Area<T> must override a superclass method
- 名前の衝突: タイプ Area のメソッド add(T) は、タイプ Group の add(Business) と同じ消去を持ちますが、それをオーバーライドしません
Group::add() メソッドに同様の型を指定して、同じ型シグネチャを持つようにするバリエーションを試しました。
public Group add(T comp) { ... }
しかし、それは同様に失敗します:
Multiple markers at this line
- タイプ Area のメソッド add(T) は、スーパークラス メソッドをオーバーライドする必要があります - labs.composite.company.Group.add をオーバーライドします - 名前の衝突: タイプ Area のメソッド add(T) は、タイプの add(T) と同じ消去がありますグループ化しますが、オーバーライドしません
ここで何かが足りないのですか?ティア
PS: 実際には、このジェネリックの使用は、とにかく私が望むことを正確に行うとは思いません (たとえそれが機能したとしても!)。なぜなら、各レベルで上限を変更するだけでなく、特定の単一レベルを必要とするからです。型階層であり、共変の引数型ではありません。「 Composite のサブタイプである任意のタイプ T については、 add() メソッドでそのタイプのオブジェクトのみを受け入れます」のようなものが本当に必要ですComposite "のサブタイプです。Java の引数は共変であり、LSP では常にサブタイプの使用が許可されるため、これは不可能だと思います。