泛型类的java类型安全错误
编辑:设置
有一个从ProgramFactory调用方法的解析器,该工厂使用表达式、语句、类型和程序,如下面实现的标题所示。
ProgramFactory实现IProgramFactory,这是一个看起来像public interface IProgramFactory<E, S, T, P>
的接口
我似乎遇到的问题是,表达式也是通用的,我不知道如何在实现中(在头和方法中)正确地实现它
当只有返回类型是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);
这就是添加的类的样子
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>{
共 (0) 个答案