我很难创建类型安全行为,我将使用一个通用示例来强调我的问题:

我有一个接口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之类的操作的常规接口)。我可以将新东西放到棚子里,然后将它们装在实现ShedBoxBox中。

到目前为止,当我尝试制作一些其他类将使事情有所不同的类时,就会出现问题,例如CoolShed extends Shed implements BoxCreator会将事情放入CoolBox es(扩展了ShedBox)中。

现在它可以工作,但是我在CoolShed类中有几个下调(从普通的BoxCoolBox),可能不太好。

我正在寻找的是一种制作方式

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返回的值已经是ShedBoxCoolBox类型。

08-27 15:19