タイプ セーフな動作を作成するのに苦労しています。問題を強調するために、一般的な例を使用します。
BoxCreator
私は次のように定義されたインターフェースを持っています:
public interface BoxCreator{
public Box create(int id ,List<Box> others);
}
と、のようなメソッドを持つ一般的なBox
クラス (Aには他のいくつかのesBox
を含めることができます) があります。Box
int getId()
Box getInternalBox(int id)
クラスがあるとしますShed implements BoxCreator,Container
(コンテナは、 add や remove などのアクションを備えた単なる一般的なインターフェースです)。私は小屋の中に新しいものを置くことができShedBox
ますBox
。
これまでのところ問題はありませんが、たとえば、物事をes (拡張)CoolShed extends Shed implements BoxCreator
に入れるなど、少し異なることを行う他のクラスを作成しようとすると、問題が発生します。CoolBox
ShedBox
今のところは機能しますが、クラスにいくつかのダウンキャストがありますCoolShed
(一般的なBox
ものから までCoolBox
)。
私が探しているのは作り方です
Shed<T extends ShedBox> implements BoxCreator<T>
そして、実装するときは、次のCoolShed
ようにします
CoolShed extends Shed<CoolBox> implemets BoxCreator<CoolBox>
さまざまなクラスをジェネリックにしようとしましたが、ジェネリックcreate
メソッドを作成できませんでしたT
。だから私は少し迷っています。
いくつかのメモ:
- は
CoolShed
多くのロジックを使用しますが、クラスをコンテナーとしてShed
使用するようにしたいと思います。CoolBox
- 現在、
Shed
には のインスタンスがあるBoxCreator
ため、作成時に新しい作成者を作成するCoolShed
だけで機能します。CoolShed
CoolShed
インスタンスしかありませんが、クラスでCoolBox
拡張するものは何も気にしません。ShedBox
Shed
目的の動作を実現する方法の適切な説明が見つからなかっただけでなく、既存のキャストが問題ないかどうかもわかりませんでした
私の例は非常に長いことを知っています。できる限り明確にしていただければ幸いです。
編集
質問を明確にするためのコード テンプレート:
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)
}
}