Противоречивость общих типов между взаимозависимыми классами
Я пытаюсь написать тесты JUnit для моего дерева выражений. Дерево состоит из BaseExpression Tree
Предполагается, что структура данных совместима с String, Double и List
Классы реализованы с помощью дженериков. с реализациями Double и String проблем не было, однако реализации List
Суть проблемы - конструктор 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;
}
}
в основном
Eclipse выдает следующую ошибку:
The constructor ListOperator<List<Double>>(DoubleOperator) is undefined
Есть ли решение, которое не предполагает использование групповых символов? Инструкции по выполнению домашних заданий были довольно явными, общие определения классов описаны в подсказке.
Я мог бы использовать подстановочные знаки в параметрах конструктора, но до сих пор я не смог этого сделать.
public ListOperator (? extends ExpressionOperator<T> operator){
а также
public ListOperator (< ? extends ExpressionOperator<T>> operator){
оба дают ошибки.
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)
,