Есть ли способ использовать только поле, связанное с рекурсивным типом при заданном условии? - PullRequest
0 голосов
/ 30 октября 2018

Я новичок в Java и пришел из Python, так что я не очень разбираюсь в обобщениях, но я пытаюсь создать общий класс Parameter, который содержит поле value, которое может быть int, float, string или массив одного из предыдущих типов :

public class Parameter<T> {
    private final String name;
    ...
    private final Utils.Range<T> range;
    private final RANGE_TYPE range_type;
    private final T value;

    public enum RANGE_TYPE {CONTINUOUS, DISCREET};
    ...

    /* constructor / builder class etc */
    ...
}

Он также должен иметь диапазон, который я реализовал следующим образом:

public class Utils {
    /**
     * Collection of helper classes
     */
    public static class Range<T extends Comparable<T>> {
        /**
         * Generic Inclusive Range (designed for int / float / double).
         */
        private final T start;
        private final T end;

        public Range(T start, T end) {
            this.start = start;
            this.end = end;
        }

        public boolean contains(T number) {
            return (number.compareTo(start) > 0 && number.compareTo(end) < 0);
        }

    }
}

Данные, которые я помещаю в этот класс Parameter, поступают из REST API, который выдает JSON для каждого "блока" (у меня также есть класс Block, который выражает иерархию блоков - в основном DAG, но каждый блок может содержать подблоки). Мне нужен универсальный способ инкапсуляции данных этого параметра без прямой зависимости от структуры данных из API REST.

Проблема в том, что универсальные типы между полем range в классе Parameter и самим классом Range несовместимы. Я не могу сделать класс Parameter расширенным Comparable, так как T может быть контейнером (List, ArrayList и т. Д.). Примечание. Если T является классом контейнера, диапазон будет проверяться поэлементно.

Я иду на это с неправильного направления? В Python я бы реализовал это как диктовку и не слишком беспокоился о типах значений.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Параметр общего типа диапазона должен быть сопоставимым. Параметр общего типа параметра не обязательно является сопоставимым.

Параметр также должен применять это ограничение, если оно необходимо для внутреннего создания Range.

class Parameter<T extends Comparable<T>> 

Кстати, все классы и перечисления должны быть в случае верблюдов, по договоренности. RANGE_TYPE должно быть RangeType.

0 голосов
/ 30 октября 2018

Есть ли у вас зависимость между универсальным типом Range и параметром из Parameter?

В противном случае их можно разделить на 2 общих параметра в классе параметров, как показано ниже.

public static class Parameter<T, R extends Comparable<R>> {
    private final String name;
    private final Range<R> range;
    private final RANGE_TYPE range_type;
    private final T value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...