3

我正在尝试为我的表达式树编写 JUnit 测试。树由 BaseExpressionTree<ValueType>(终端节点)、ExpressionOperator<T>(非终端节点)和 CompositeExpressionTree<ValueType>(子树)组成。

数据结构应该与 String、Double 和 List<String> 或 List<Double> 作为 BaseExpression(终端叶)兼容。

这些类是用泛型实现的。Double 和 String 实现没有问题,但是 List< String> 和 List< Double> 实现会导致与泛型发生冲突。

问题的核心是 ListOperator 构造函数。ListOperator 用于表示对 ArrayList 和 LinkedList 等结构的操作。我想声明类如下:

public class ListOperator<List<T>> implements ExpressionOperator<List<T>>{

...

但相反,我只能将其声明如下:

public class ListOperator< T> implements ExpressionOperator<List<T>>{
    // a private field to store the String or Double operator to be used on the lists
    private ExpressionOperator<T> scalarOperator;

    /**
     * a constructor that takes one expression operator and stores it in the scalarOperator variable
     * @param       operator        an operation to be executed on a set of List operands
     */
    public ListOperator (ExpressionOperator<T> operator){
        this.scalarOperator=operator;
    }
}

基本上 ListOperator 中的 < T> (表示列表)与 ExpressionOperator 中的 < T> (应该表示列表中的内容)冲突。

Eclipse 给出以下错误输出:

The constructor ListOperator<List<Double>>(DoubleOperator) is undefined

有没有不涉及使用通配符的解决方案?作业说明相当明确,类定义的泛型是它们在提示中的描述方式。

我可以在构造函数参数中使用通配符,但到目前为止我还不能这样做。

    public ListOperator (? extends ExpressionOperator<T> operator){

    public ListOperator (< ? extends ExpressionOperator<T>> operator){

两者都给出错误。

4

1 回答 1

1

我认为您的问题与使用ArrayList<Double>类型ValueType参数有关,而不是List<Double>,这会导致与ListOperator.

尝试使用List<Double>无处不在而不是ArrayList<Double>.

更新:

你的ListOperator班级应该看起来像

public class ListOperator<T> implements ExpressionOperator<List<T>> { 
    // unchanged
  ...
  public ListOperator(ExpressionOperator<T> operator) {
    ...
  }
}

你应该将它调用为new ListOperator<Double>(myDoubleOperator).

于 2012-04-27T01:56:13.850 回答