我正在创建一个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
的未编写期望,涉及未经检查的强制转换(并且引发了编译器警告),似乎甚至没有使用泛型类型,因为我可以用非参数类型实现相同的效果,并且通常看起来必须有更好的方法来做到这一点。
如果有人能指出我如何做到这一点的正确方向,我会感激不尽。谢谢!