我很难创建类型安全行为,我将使用一般示例来强调我的问题:
我有一个接口BoxCreator
,它由以下人员定义:
public interface BoxCreator{
public Box create(int id ,List<Box> others);
}
和一般Box
类(A Box
可以包含其他几个Box
es,其中包含int getId()
,Box getInternalBox(int id)
等方法。
假设我有一个类Shed implements BoxCreator,Container
(其中容器只是一个带有添加和删除操作的通用接口)。我可以把新东西放进棚子里,然后把它们放在一个ShedBox
中,它实现Box
。
到目前为止,这个问题很好,当我尝试创建一些其他类会做一些不同的事情时会出现问题,例如CoolShed extends Shed implements BoxCreator
会将事物放入CoolBox
es(扩展{{} 1}})。
目前它有效,但我在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
。{/ li>
醇>
我无法找到如何实现所需行为的良好解释,也无法判断我现有的演员是否为O.K。
我知道我的榜样很长,我很乐意以任何方式让我更清楚。
修改
使问题更清晰的代码模板:
Shed
答案 0 :(得分: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(...)
。然后,您不必从Box
转换到所需的子类,因为create
返回的值已经是ShedBox
或CoolBox
类型。