我正在尝试实现一个访问者设计模式,我有一个类结构,在我想要访问的操作之间有很多类和变量返回类型。
尽管严格遵循访问者模式,但我收到了很多编译错误Classname is not abstract and does not override abstract method accept(Visitor) in Visitable
。
例如我的班级添加
public class Add extends BinaryExpression implements Visitable {
/* content of the class supressed */
public Integer accept(Visitor v) {
return v.visit(this);
}
}
对于Add类的访问者,它总是返回int,但是其他类的访问者将返回同一类中的其他类型甚至变量类型。
在我的可访问界面上我有(使用泛型类型作为变量返回类型。)
public interface Visitable<T> {
public T accept(Visitor v);}
在我的访客界面上我有
public interface Visitor<T> {
public T visit(Add c);
我的评估员访客
public class Evaluator<T> implements Visitor{
public Integer visitAdd(Add c){
return c.first().accept(this) + c.second().accept(this);
}
答案 0 :(得分:2)
错误是因为与int
不同,Object
是原始而非Integer
类型。换一种说法,
泛型类型只接受对象引用类型,但不接受基元,因此将accept(Visitor v)
方法返回类型更改为Integer
,以便它将编译:
public class Add extends BinaryExpression implements Visitable {
public Integer accept(Visitor v) {
return v.visit(this);
}
}