假设我们有三个类 - AbstractMessage
,AbstractEngine
和AbstractAction
。这三个类都以通用的方式相互引用,因此每个引擎都有相应的消息和操作,您可以直接在代码中引用它们。如何确保这是我的类签名中引用的泛型类型?
public class MyMessage<M extends AbstractMessage<M,E,A>, E extends AbstractEngine<M,E,A>, A extends AbstractAction<M,E,A>> {
这工作正常,但是当我尝试在最高级别执行行为时遇到了一些问题。我的AbstractAction类具有正是如此定义的applyTo
方法:
protected abstract M applyTo(E engine, Object guarantee);
和我AbstractEngine类有这个
private final M apply(A action) {
return action.apply(this, this.guarantee);
}
而正是在这条线,它不太愿意 - 抱怨说:
The method applyTo(E, Object) in the type AbstractAction<M,E,A> is not
applicable for the arguments (AbstractEngine<M,E,A>, Object)
现在其原因很明显 - 所讨论的E可能是一些OTHER AbstractEngine,并且无法知道我们调用它的子类是否实际上是一个E
。
我的问题是,我怎么能说对确定性,如果你要class MyEngine extends AbstractEngine<M...,E...,A...>
这MyEngine
是MUST是E
?并有这种确定性烘烤到AbstractEngine
?
下面是一个说明问题的小例子。
class EngineExample {
static abstract class AbEng<A extends AbAct<A,M,E>, M extends AbMes<A,M,E>, E extends AbEng<A,M,E>> {
final M func(A act) {
return act.apply(this); // compile error here
}
}
static abstract class AbMes<A extends AbAct<A,M,E>, M extends AbMes<A,M,E>, E extends AbEng<A,M,E>> {
}
static abstract class AbAct<A extends AbAct<A,M,E>, M extends AbMes<A,M,E>, E extends AbEng<A,M,E>> {
abstract void apply(E e);
}
static class RealEng extends AbEng<RealAct, RealMes, RealEng> {
}
static class RealMes extends AbMes<RealAct, RealMes, RealEng> {
}
static class RealAct extends AbAct<RealAct, RealMes, RealEng> {
void apply(RealEng eng) {
System.out.println("applied!");
}
}
}
@Tezra并非所有的东西都需要mcve。我没有类型错误。对不起,你不明白这个问题,但也许你应该再读一遍。也许还可以读瓦伦丁的答案,这是对问题所在的尝试。 – corsiKa
Tezra,A将永远是'AbstractAction' - 就在第一个代码片段中。就编译时限制它们的类型而言,我不想在每个类上都定义它们 - 我想在实例时声明它们。我以前使用过这个范例,并且它工作得很好*除了*这个愚蠢的类型问题不知道它们是在通用描述符中指定的类型。而已。 – corsiKa
@Tezra对不起,对'AbstractMessage','AbstractAction'和'AbstractEngine'中的每一个,您都有'M extends AbstractMessage,E extends AbstractEngine ,A extends AbstractAction 'rider。我认为这是这个问题的暗示,但它似乎没有。 –
corsiKa