3

タイプ セーフな動作を作成するのに苦労しています。問題を強調するために、一般的な例を使用します。

BoxCreator私は次のように定義されたインターフェースを持っています:

public interface BoxCreator{
    public Box create(int id ,List<Box> others);
}

と、のようなメソッドを持つ一般的なBoxクラス (Aには他のいくつかのesBoxを含めることができます) があります。Boxint getId()Box getInternalBox(int id)

クラスがあるとしますShed implements BoxCreator,Container(コンテナは、 add や remove などのアクションを備えた単なる一般的なインターフェースです)。私は小屋の中に新しいものを置くことができShedBoxますBox

これまでのところ問題はありませんが、たとえば、物事をes (拡張)CoolShed extends Shed implements BoxCreatorに入れるなど、少し異なることを行う他のクラスを作成しようとすると、問題が発生します。CoolBoxShedBox

今のところは機能しますが、クラスにいくつかのダウンキャストがありますCoolShed(一般的なBoxものから までCoolBox)。

私が探しているのは作り方です

Shed<T extends ShedBox> implements BoxCreator<T>

そして、実装するときは、次のCoolShedようにします

CoolShed extends Shed<CoolBox> implemets BoxCreator<CoolBox>

さまざまなクラスをジェネリックにしようとしましたが、ジェネリックcreateメソッドを作成できませんでしたT。だから私は少し迷っています。

いくつかのメモ:

  1. CoolShed多くのロジックを使用しますが、クラスをコンテナーとしてShed使用するようにしたいと思います。CoolBox
  2. 現在、Shedには のインスタンスがあるBoxCreatorため、作成時に新しい作成者を作成するCoolShedだけで機能します。CoolShed
  3. CoolShedインスタンスしかありませんが、クラスでCoolBox拡張するものは何も気にしません。ShedBoxShed

目的の動作を実現する方法の適切な説明が見つからなかっただけでなく、既存のキャストが問題ないかどうかもわかりませんでした

私の例は非常に長いことを知っています。できる限り明確にしていただければ幸いです。

編集

質問を明確にするためのコード テンプレート:

public interface BoxCreator{
    public Box create(int id ,List<Box> others);
}

public interface Box{
    void put()
    void addAnother(Box box);
}

public class ShedBox implements Box{
    void put()
    void addAnother(Box box);
}

public class CoolBox extends ShedBox{ //has some extra features but moslty the same
    void put()
    void addAnother(Box box);
}

public interface Container {
    Box addValue(int value);
    Box getBox(int id);
    .
    .
}

public class Shed implements Container, BoxCreator {
    BoxCreator creator;
    SomeCollection<Box> boxes;
    Shed(){
        creator = this;
        .
        .
        .
    }

    Box addValue(int id){
        .
        .//some logic to get otherBox here
        .
        Box box = creator.createBox(id,otherBox);
    }

    Box getBox(int id);

    public Box create(int id ,Box other){
        return new ShedBox(id,others)
    }
}

public class CoolShed extends Shed implements BoxCreator {

    CoolShed(){
        creator = this;
        .
        .
        .
    }

    addValue(int id){
        Box boxAdded = super.add(id)
        .
        .
        .
        CoolBox box = (CoolBox)boxAdded; // The questionable cast
        .
        . //Some logic that involves CoolBox specific actions 
        .
    }

    public Box create(int id ,Box other){
        return new CoolBox(id,others)
    }

}
4

1 に答える 1

0

(以前の回答は削除されました)

others編集:ボックスが含まれている可能性があると仮定すると、このソリューションはより良いはずです:

public interface BoxCreator {
    public Box create(int id, List<Box> others);
}
public class Shed implements BoxCreator {
    @Override
    public ShedBox create(int id, List<Box> others) {
        ...
    }
}
public class CoolShed extends Shed {
    @Override
    public CoolBox create(int id, List<Box> others) {
        ...
    }
}

また、これをしないでください:

BoxCreator creator;
creator = this;
creator.create(...);

代わりに、this.create(...)または単に書く必要がありますcreate(...)。から返される値はすでにor型Boxであるため、 from を目的のサブクラスにキャストする必要はありません。createShedBoxCoolBox

于 2013-05-16T18:33:41.210 に答える