Противоречивость общих типов между взаимозависимыми классами

Я пытаюсь написать тесты JUnit для моего дерева выражений. Дерево состоит из BaseExpression Tree (терминальные узлы), ExpressionOperator (нетерминальные узлы) и CompositeExpressionTree (вложенные деревья).

Предполагается, что структура данных совместима с String, Double и List или List как BaseExpression (выходы терминала).

Классы реализованы с помощью дженериков. с реализациями Double и String проблем не было, однако реализации List и List вызывают конфликты с 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 (который представляет список) конфликтует с в ExpressionOperator (который должен представлять то, что находится внутри списка).

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),

Другие вопросы по тегам