假设我有:
public class FightingZone<MobileSuitso, Background> {
private MobileSuitCollection<MobileSuitso> msCollection;
private BackgroundInfo<Background> bgInfo;
public FightingZone(MobileSuitCollection<MobileSuitso> newCollection, BackgroundInfo<Background> newInfo) {
this.msCollection = newCollection;
this.bgInfo = newInfo;
}
...
...// inside a method
MobileSuitCollection temporaryCollection = new MobileSuitCollection<MobileSuitso>(); // /!\
}
问题是 MobileSuitCollection 是一个接口(interface),所以我无法实例化它。例如,我可以这样做:
MobileSuitCollection temporaryCollection = new GundamMeisterCollection<MobileSuitso>();
MobileSuitCollection temporaryCollection = new InnovatorCollection<MobileSuitso>();
MobileSuitCollection temporaryCollection = new CannonFolderCollection<MobileSuitso>();
等但是,要操作 temporaryCollection
,我需要它与通过参数传递给我的类的类型相同。所以我考虑这样做:
if (msCollection instanceof GundamMeisterCollection) {
...
} else if (msCollection instanceof InnovatorCollection) {
...
} ...
不过我知道这很糟糕。有一个更好的方法吗?是否可以保留对初始类型使用的类的引用,然后用它实例化 temporaryCollection
?
最佳答案
您放在 if 子句中的代码可以放在 Visitor
中:
// Generics skipped for brevity
interface MobileSuitCollectionVisitor {
handleCollection(GundamMeisterCollection collection);
handleCollection(InnovatorCollection collection);
handleCollection(CannonFolderCollection collection)
}
class ConcreteVisitor implements MobileSuitCollectionVisitor {
// place all of the logic in the implemented methods
}
然后让 MobileSuitCollection
有一个方法:
void visit(MobileSuitCollectionVisitor visitor);
并且在 MobileSuitCollection
的每个实现中都有
public void visit(MobileSuitCollectionVisitor visitor) {
visitor.handleCollection(this);
}
关于java - 有没有比使用 instanceof 更好/更干净的方法来有条件地创建类型? [ java ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3144759/