Java 责任链设计原则中的泛型编译器错误
Java Generics Compiler Error in Chain of Responsibility design principle
public abstract class AbstractExecutor<PARAM, RET> {
private AbstractExecutor<?, ?> nextExecutor;
public abstract RET execute(PARAM param);
public void executeAll(PARAM par) {
System.out.println("Executing..");
RET ret= execute(par);
if(this.nextExecutor!=null){
System.out.println("Executing.." + this.getClass());
this.nextExecutor.executeAll(ret);
}
}
public AbstractExecutor<?, ?> setNextExecutor(AbstractExecutor<?,?> next){
this.nextExecutor = next;
return this.nextExecutor;
}}
任何人都可以帮我解决这段代码,为什么我在这里错了“this.nextExecutor.executeAll(ret);” ?我正进入(状态
“类型 AbstractExecutor 中的方法 executeAll(capture#4-of ?) 不适用于参数 (RET)”
但无法理解这里出了什么问题?
如何更正此问题?
在您的代码中,PARAM
和 RET
是 [type] 参数,即它们不是实际类型。
方法executeAll
本质上是一个递归方法,即它调用自身,方法execute
返回的值作为[递归调用]方法executeAll
的参数。因此 RET 必须与 PARAM 相同或它的子集。因此,下面的代码编译通过。
public abstract class AbstractExecutor<PARAM, RET extends PARAM> {
private AbstractExecutor<PARAM, RET> nextExecutor;
public abstract RET execute(PARAM param);
public void executeAll(PARAM par) {
System.out.println("Executing..");
RET ret = execute(par);
if (this.nextExecutor != null) {
System.out.println("Executing.." + this.getClass());
this.nextExecutor.executeAll(ret);
}
}
public AbstractExecutor<PARAM, RET> setNextExecutor(AbstractExecutor<PARAM, RET> next) {
this.nextExecutor = next;
return this.nextExecutor;
}
}
public abstract class AbstractExecutor<PARAM, RET> {
private AbstractExecutor<?, ?> nextExecutor;
public abstract RET execute(PARAM param);
public void executeAll(PARAM par) {
System.out.println("Executing..");
RET ret= execute(par);
if(this.nextExecutor!=null){
System.out.println("Executing.." + this.getClass());
this.nextExecutor.executeAll(ret);
}
}
public AbstractExecutor<?, ?> setNextExecutor(AbstractExecutor<?,?> next){
this.nextExecutor = next;
return this.nextExecutor;
}}
任何人都可以帮我解决这段代码,为什么我在这里错了“this.nextExecutor.executeAll(ret);” ?我正进入(状态
“类型 AbstractExecutor
在您的代码中,PARAM
和 RET
是 [type] 参数,即它们不是实际类型。
方法executeAll
本质上是一个递归方法,即它调用自身,方法execute
返回的值作为[递归调用]方法executeAll
的参数。因此 RET 必须与 PARAM 相同或它的子集。因此,下面的代码编译通过。
public abstract class AbstractExecutor<PARAM, RET extends PARAM> {
private AbstractExecutor<PARAM, RET> nextExecutor;
public abstract RET execute(PARAM param);
public void executeAll(PARAM par) {
System.out.println("Executing..");
RET ret = execute(par);
if (this.nextExecutor != null) {
System.out.println("Executing.." + this.getClass());
this.nextExecutor.executeAll(ret);
}
}
public AbstractExecutor<PARAM, RET> setNextExecutor(AbstractExecutor<PARAM, RET> next) {
this.nextExecutor = next;
return this.nextExecutor;
}
}