我很难创建类型安全行为,我将使用一个通用示例来强调我的问题:
我有一个接口BoxCreator
,其定义如下:
public interface BoxCreator{
public Box create(int id ,List<Box> others);
}
和一个普通的
Box
类(一个Box
可以包含其他几个Box
es),该类具有类似int getId()
,Box getInternalBox(int id)
的方法。假设我有一个类
Shed implements BoxCreator,Container
(其中容器只是具有诸如add和remove之类的操作的常规接口)。我可以将新东西放到棚子里,然后将它们装在实现ShedBox
的Box
中。到目前为止,当我尝试制作一些其他类将使事情有所不同的类时,就会出现问题,例如
CoolShed extends Shed implements BoxCreator
会将事情放入CoolBox
es(扩展了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)
}
}
最佳答案
(先前的答案已删除)
编辑:假定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(...)
。这样,您就不必从Box
强制转换为所需的子类,因为从create
返回的值已经是ShedBox
或CoolBox
类型。