【问题标题】:Is there a way to only use a recursive type bound field given a condition?有没有办法在给定条件的情况下只使用递归类型绑定字段?
【发布时间】:2018-10-30 17:13:39
【问题描述】:

我是 Java 新手,来自 Python,所以我不太了解泛型,但我正在尝试创建一个包含 value 字段的通用 Parameter 类,它可以是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,它为每个“块”吐出 JSON(我还有一个 Block 类,它表达了块的层次结构 - 基本上是一个DAG,但每个块可以包含子块)。我想要一种通用的方法来封装这个参数数据,而不是直接依赖于来自 REST API 的数据结构。

问题是,Parameter 类中的 range 字段与 Range 类本身之间的泛型类型不兼容。我不能让Parameter 类扩展Comparable,因为T 可以是一个容器(List、ArrayList 等)。注意:如果T 是一个容器类,则将按元素检查范围。

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

【问题讨论】:

  • T 是一个数组的用例是什么?你是怎么用的?
  • @ernest_k - 我尝试使用的 JSON 中的值字段可以是 float/int/etcfloat[](甚至是 float[][]),范围字段适用如果它是一个集合,则在元素方面。

标签: java oop generics design-patterns


【解决方案1】:

Range 的泛型类型和 Parameter 的泛型类型之间是否存在依赖关系?

如果没有,您可以将它们分隔在 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;

【讨论】:

  • 这是有道理的,我没有想到你可以有多个通用参数。 RT 可能是同一类型,但在 T 是一个数组的情况下,它们不可能是我不认为的。谢谢。
【解决方案2】:

Range 的泛型类型参数必须是 Comparable。 Parameter 的泛型类型参数不一定是 Comparable。

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

class Parameter<T extends Comparable<T>> 

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

【讨论】:

  • 是的,这就是问题所在,我无法创建class Parameter&lt;T extends Comparable&lt;T&gt;&gt; ,除非数组/列表扩展Comparable
  • @Aidenhjj 我的错,他们不是。
  • 我认为基本上你的问题只是缺少太多细节。什么是“参数”?它需要获取一些集合(列表或数组),然后在内部创建一系列集合。您将如何开始定义一系列集合?
  • 集合的范围是元素方面的。我很乐意接受有关如何彻底重新思考我的方法的建议。
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2019-08-12
  • 1970-01-01
相关资源
最近更新 更多