确保子类是泛型类的超类的实例

时间:2016-04-03 01:27:22

标签: java generics inheritance

我正在创建一个java utils库,并遇到了泛型问题。我找到了一个让库运行的解决方案,但它似乎是糟糕的代码实践,并且容易出现未检测到的程序故障。出于问题的原因,我已将该程序简化为最低限度可验证的示例。

我们说我有一个接口Invokable<E>,它被要求实现E

public interface Invokable<E> {

    void invoke(E e);

}

我们说我有另一个界面InvokableFactory<E>,它会创建Invokable<E> s

public interface InvokableFactory<E> {

    Invokable<E> create();

}

现在让我们说我有一个课程InvokableUser<E>,旨在扩展。它包含InvokableFactory<E>,并使用它来创建Invokable<E>,然后它会自行调用。

public class InvokableUser<E> {

    private InvokableFactory<E> factory;

    public InvokableUser(InvokableFactory<E> factory) {
        this.factory = factory;
    }

    public void start() {
        factory.create().invoke((E) this);
    }

}

你可能会发现我的难题是我试图确保子类InvokableUser,扩展自身泛型类型的InvokableUser。我试图确保InvokableUser包含一个生成Invokable的工厂,该工厂可以使用InvokableUser对象调用,但仍然可以传递一个类型的对象InvokableUser的子类,以便Invokable可以使用仅由InvokableUser的子类添加的方法。

我觉得我可能不会很好地解释这一点,例如,让我们说Invokable的子类需要打印出添加的getString方法通过InvokableUser的子类,像这样:

public class PrintingInvokable implements Invokable<PrintingInvokableUser> {

    @Override
    public void invoke(PrintingInvokableUser e) {
        System.out.println(e.getString());
    }

}

public class PrintingInvokableUser extends InvokableUser<PrintingInvokableUser> {

    public PrintingInvokableUser() {
        super(PrintingInvokable::new);
    }

    public String getString() {
        return "( ͡° ͜ʖ ͡°)";
    }

}

如果您创建new PrintingInvokableUser()并在其上调用start(),则会在其上创建new PrintingInvokable()并致电invoke(this),然后将打印出{{1} } getString()

的方法

虽然我的代码确实适用于此,但它取决于PrintingInvokableUser的子类Foo将扩展InvokableUser的未编写期望,涉及未经检查的强制转换(并且引发了编译器警告),似乎甚至没有使用泛型类型,因为我可以用非参数类型实现相同的效果,并且通常看起来必须有更好的方法来做到这一点。

如果有人能指出我如何做到这一点的正确方向,我会感激不尽。谢谢!

0 个答案:

没有答案