如何从具有泛型返回类型的方法返回实际实例

时间:2013-05-16 18:15:40

标签: java generics types return

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

我有一个接口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班级(从一般CoolShedBox)有几个可能“不漂亮”的下线。

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

CoolBox

然后在实施Shed<T extends ShedBox> implements BoxCreator<T>时我会做类似

的事情

CoolShed

我试图让各种类变得通用,但却无法创建通用CoolShed extends Shed<CoolBox> implemets BoxCreator<CoolBox>方法,因为我无法实例化create或返回一个。所以我有点失落。

几点说明:

  1. T使用了很多CoolShed逻辑,但我只是让它使用Shed类作为容器。
  2. 目前CoolBox有一个Shed的实例,所以在创建BoxCreator时,我只是让CoolShed成为新的创作者并且它有效。
  3. CoolShed只会有CoolShed个实例,但我真的不介意在CoolBox课程中扩展ShedBox。{/ li>

    我无法找到如何实现所需行为的良好解释,也无法判断我现有的演员是否为O.K。

    我知道我的榜样很长,我很乐意以任何方式让我更清楚。

    修改

    使问题更清晰的代码模板:

    Shed

1 个答案:

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