相互依赖的类之间存在冲突的通用类型

时间:2012-04-27 00:46:49

标签: java generics junit

我正在尝试为Expression Tree编写JUnit测试。该树由BaseExpressionTree<值类型> (终端节点),ExpressionOperator< T> (非终端节点)和CompositeExpressionTree<值类型> (子树)。

数据结构应该与String,Double和List<串GT;或列表<双>作为BaseExpression(终端离开)。

这些类是用泛型实现的。 Double和String实现没有问题,但是List<串GT;和列表<双>实现导致与泛型冲突。

问题的核心是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;
    }
}

基本上&lt; T&GT;在ListOperator(代表一个List)中与&lt; T&GT;在ExpressionOperator中(它应该表示列表中的内容)。

Eclipse提供以下错误输出:

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

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

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

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

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

都会出错。

1 个答案:

答案 0 :(得分: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)调用。