可选的泛型类型参数

问题描述

我想声明一个适用于三胞胎的通用类-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,null> t2 = new Triplet<>();

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

解决方法

例如,您可以使用Void

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

我认为,如果您确定第三个参数不存在(使用null的目的),那么它不再是三元组,而是一对。只需保持简单,然后使用Pair类即可。

,

Java不支持“可选”或渐进式输入。您可以尝试创建一个默认将元数据设置为null的子类,即NoMetadataTriple<K,V>,或者为M提供Void,而不是其他答案中提到的那样。

不能实例化Void“类型”。基本上是void(输出参数)为Class