【问题标题】:Optional generic type argument可选的泛型类型参数
【发布时间】:2020-08-13 11:06:15
【问题描述】:

我想声明一个适用于三元组的泛型类 - keyvaluemetadata

keyvalue 字段是必填字段,但 metadata 字段是可选字段。

class Triplet<K,V,M>{
    K key;
    V value;
    M metadata;
    //setters and getters
}

在使用上面的类时,我必须像下面这样初始化它 -

Triplet<Integer, String, String> t1 = new Triplet<>();
// Setters

但对于某些用例,metadata 是可选的。所以当我使用null 作为第三个类型参数时,编译器会报错-

Triplet<Integer, String, null> t2 = new Triplet<>();

我应该如何正确实例化适用于多种类型的参数化类型,其中使用站点指定的类型参数之一是可选的?

【问题讨论】:

标签: java generics java-8


【解决方案1】:

您可以使用Void,例如

Triplet<Integer, String, Void> t2 = new Triplet<>();

【讨论】:

    【解决方案2】:

    我认为,如果您确定第三个参数不存在(正如使用 null 所期望的那样),那么它不再是三元组,而是一对。保持简单,改用Pair 类。

    【讨论】:

      【解决方案3】:

      Java 不支持“可选”或渐进类型。您可以尝试创建一个将元数据默认为null 的子类,即NoMetadataTriple&lt;K,V&gt;,或者如另一个答案中所述,将Void 用于M。

      Void“类型”无法实例化。它基本上是void(输出参数)作为Class

      【讨论】:

        猜你喜欢
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多