【发布时间】:2015-05-15 09:40:32
【问题描述】:
编辑:设置
有一个从 ProgramFactory 调用方法的解析器,该工厂使用表达式、语句、类型和程序,如下面的实现的标题中所示。
ProgramFactory 实现了 IProgramFactory,它是一个看起来像这样的接口 public interface IProgramFactory<E, S, T, P>
我似乎遇到的问题是 Expression 也是通用的,我不知道如何在实现中正确处理(在标头和方法中)
当只有返回类型是 Expression 类型时,它似乎可以工作,如下所示
@Override
public Expression<Boolean> createTrue(SourceLocation sourceLocation) {
True expr = new True();
return expr;
}
但不是当变量也是表达式类型时
我这样做是为了返回类型和参数类型的通配符 不必相同
public abstract class BinaryExpression<T, R> extends Expression<T>{
Expression<R> left;
Expression<R> right;
}
在一个接口的实现中,我似乎一遍又一遍地遇到同样的问题。
Expression is a raw type. References to generic type Expression<T> should be parameterized
问题是当我参数化这些表达式时,它们告诉我接口没有这个方法。
The method createAddition(Expression<Double>, Expression<Double>, SourceLocation) of type ProgramFactory must override or implement a supertype method
这就是实现的样子
@Override
public Expression<Double> createAddition(Expression left, Expression right, SourceLocation sourceLocation) {
Addition expr = new Addition(left, right);
return expr;
}
界面是这样的
/** An expression that evaluates to the sum of the given expressions */
E createAddition(E left, E right, SourceLocation sourceLocation);
这是 Addition 类的样子
public class Addition extends BinaryExpression<Double, Double>{
public Addition(Expression<Double> left, Expression<Double> right){
this.left = left;
this.right= right;
}
@Override
public Double eval() {
Double sum = left.eval() + right.eval();
return sum;
}
}
这就是 Expression 类的样子
public abstract class Expression<T> {
public abstract T eval();
}
这是实现的标头的样子
public class ProgramFactory implements IProgramFactory<Expression<?>, Statement, Type, Program>{
【问题讨论】:
-
缺少重要的位,前两个sn-ps的接口和类声明(
ProgramFactory和实现类)
标签: java generics types interface abstract