问题描述
我想声明一个适用于三胞胎的通用类-key
,value
和Metadata
。
key
和value
字段是必填字段,而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
。