有没有一种方法只能在给定条件的情况下使用递归类型绑定字段?

时间:2018-10-30 17:13:39

标签: java oop generics design-patterns

我是Java的新手,也是Python的新手,所以我不太了解泛型,但我试图制作一个包含Parameter字段的通用value类,可以是intfloatstring 或先前类型之一的数组

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,该API为每个“块”吐出JSON(我也有一个Block类,用于表示块-基本上是DAG,但每个块可以包含子块)。我想要一种封装这种参数数据的通用方法,而不必直接依赖REST API的数据结构。

问题在于,range类的Parameter字段与Range类本身之间的通用类型不兼容。我不能使Parameter类扩展Comparable,因为T可以是一个容器(列表,数组列表等)。注意:如果T是容器类,则将按元素检查范围。

我是从错误的方向来的吗?在python中,我会将其实现为dict,而不必过多担心值的类型。

2 个答案:

答案 0 :(得分:1)

Range的通用类型和Parameter的通用类型之间是否有任何依存关系?

如果没有,您可以将它们分为两个以下的Parameter类中的通用参数。

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;

答案 1 :(得分:1)

范围的通用类型参数必须是可比较的。参数的通用类型参数不一定是可比较的。

如果您需要在内部创建范围,则参数也必须强制执行此约束。

class Parameter<T extends Comparable<T>> 

顺便说一句,按照惯例,所有类和枚举都应为驼峰式。 RANGE_TYPE应该是RangeType