Я новичок в 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 я бы реализовал это как диктовку и не слишком беспокоился о типах значений.