редактирования: УстановкаТипа с общим классом
Существует парсер, что вызов метода из ProgramFactory, эта фабрика использует выражения, оператор, тип и программу, как показана в заголовке для реализации ниже. ProgramFactory реализует IProgramFactory, который является интерфейсом, который выглядит следующим образом public interface IProgramFactory<E, S, T, P>
Проблема у меня, кажется, есть то, что выражение является также общим, и я не знаю, как получить это право в реализации (в заголовке и в методах)
это похоже на работу, когда только тип возвращаемого значения типа выражения, как показано здесь
@Override
public Expression<Boolean> createTrue(SourceLocation sourceLocation) {
True expr = new True();
return expr;
}
, но не тогда, когда переменная также типа Expression
Я сделал это так, что маски для возвращаемого типа и для типа аргумента у не должны быть такими же
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>{
Есть важные биты отсутствует, декларацию интерфейса и класса первых два фрагментов ('ProgramFactory' и класс реализации) – biziclop