我正在尝试为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){
都会出错。
答案 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)
调用。