【发布时间】:2013-05-11 18:26:57
【问题描述】:
我很难创建类型安全的行为,我将使用一个通用示例来强调我的问题:
我有一个接口BoxCreator,它的定义是:
public interface BoxCreator{
public Box create(int id ,List<Box> others);
}
还有一个通用的Box 类(一个Box 可以包含其他几个Boxes),它具有int getId()、Box getInternalBox(int id) 等方法。
假设我有一个 Shed implements BoxCreator,Container 类(其中容器只是一个通用接口,带有 add 和 remove 之类的操作)。我可以把新东西放在棚子里,它会把它们装在一个实现Box的ShedBox中。
到目前为止一切都很好,当我尝试制作一些其他的类来做一些不同的事情时,问题就出现了,例如CoolShed extends Shed implements BoxCreator,它将把事情放入CoolBoxes(扩展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实例,但我真的不介意在Shed类中扩展ShedBox。
我只是找不到一个很好的解释来说明如何实现所需的行为,也无法判断我现有的演员表是否正常。
我知道我的示例很长,我很乐意尽我所能使其更清楚。
编辑
让问题更清晰的代码模板:
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)
}
}
【问题讨论】:
-
最好包含一个包含各种类的代码示例以显示您要实现的目标...
-
CoolShed 可以只包含 CoolBox 还是可以包含任何 Box?
-
@owlstead 有很多(相信我 :) )代码,其中大部分与问题无关,所以我担心它只会让人们更加困惑,但我做了一些可以更好地解释问题的通用模板。
-
@LeeMeador 感谢您指出这一点,
CoolShed将只有CoolBox实例,但我不介意在Shed类中扩展ShedBox的任何内容。我已将此信息添加到问题中。
标签: java generics types return