我正在尝试为我的表达式树编写 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){
两者都给出错误。