有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型类的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) 个答案