java - 泛型类的类型安全错误

标签 java generics types interface abstract

编辑:设置

有一个解析器从 ProgramFactory 调用方法,该工厂使用表达式、语句、类型和程序,如下面的实现的 header 所示。 ProgramFactory 实现了 IProgramFactory,它是一个如下所示的接口(interface) public interface IProgramFactory<E, S, T, P>

我似乎遇到的问题是表达式也是通用的,我不知道如何在实现中(在 header 和方法中)正确实现这一点

当只有返回类型是表达式类型时,它似乎可以工作,如此处所示

    @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;
}

在接口(interface)的实现中,我似乎一遍又一遍地遇到同样的问题。

Expression is a raw type. References to generic type Expression<T> should be parameterized

问题是当我参数化这些表达式时,他们告诉我该接口(interface)没有这个方法。

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();
}

这就是实现的 header 的样子

public class ProgramFactory implements IProgramFactory<Expression<?>, Statement, Type, Program>{

最佳答案

您没有提供完整的接口(interface)实现。所以我可以认为它是这样的:

class MyImplementation implements Interface<Expression> {
        @Override
        public Expression<Double> createAddition(Expression left, Expression right, SourceLocation sourceLocation) {
            Addition expr = new Addition(left, right);
            return expr;
        }
}

但应该是这样的:

class MyImplementation implements Interface<Expression<Double>> {
        @Override
        public Expression<Double> createAddition(Expression<Double> left, Expression<Double> right, SourceLocation sourceLocation) {
             Addition expr = new Addition(left, right);
             return expr;
        }
}

这是原始类型 Expression = |Expression<E>| 。并使用简单的Expression在您的方法参数中,您删除类型参数。您不能在接口(interface)实现中声明 raw Expression并使用带有类型参数(CTE)的参数覆盖方法。将类型参数视为简单的别名。

关于java - 泛型类的类型安全错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30256206/

相关文章:

java - 如何使用Java泛型方法?

database - 使用整数列在数据库中存储美国邮政编码是个好主意吗?

java - Activity 类型未定义方法 loadUrl(String)

java - Android 字节数组

java - java中带有初始化参数的并发安全单例

c++ - 从缓冲区输入的位

C++ - unique_ptr 的转换/更改类型

java - Android (Java) 转换 hh :mm:ss time String into a number representation

c# - 将通用参数传递给 MVC Action

java - 混合接口(interface)的通用参数