假設我們有三個類 - 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