式ツリーのJUnitテストを作成しようとしています。ツリーは、BaseExpressionTree <ValueType>(終端ノード)、ExpressionOperator <T>(非終端ノード)、およびCompositeExpressionTree <ValueType>(サブツリー)で構成されます。
データ構造は、BaseExpression(ターミナルリーフ)として、String、Double、およびList<String>またはList<Double>と互換性があると想定されています。
クラスはジェネリックスで実装されます。DoubleとStringの実装には問題はありませんでしたが、List<String>とList<Double>の実装がGenericsとの競合を引き起こしています。
問題の核心は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){
どちらもエラーになります。