可选的泛型类型参数

Rah*_*hak 8 java generics java-8

我要声明一个泛型类,将上三胞胎的工作- keyvaluemetadata

keyvalue字段是强制性的,但该metadata字段是可选的。

class Triplet<K,V,M>{
    K key;
    V value;
    M metadata;
    //setters and getters
}
Run Code Online (Sandbox Code Playgroud)

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

Triplet<Integer, String, String> t1 = new Triplet<>();
// Setters
Run Code Online (Sandbox Code Playgroud)

但对于某些用例metadata是可选的。所以当我null用作第三个类型参数时,编译器给出了一个错误 -

Triplet<Integer, String, null> t2 = new Triplet<>();
Run Code Online (Sandbox Code Playgroud)

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

Mur*_*göz 9

你可以使用Void例如

Triplet<Integer, String, Void> t2 = new Triplet<>();
Run Code Online (Sandbox Code Playgroud)


man*_*uti 5

我会争辩说,如果您确定第三个参数不存在(如使用 预期的那样null),那么它不再是三元组,而是一对。只需保持简单并使用Pair类即可。


小智 5

Java 不支持“可选”或渐进类型。您可以尝试创建一个子类,该子类将元数据默认为null, ie NoMetadataTriple<K,V>,或者Void如其他答案中所述,改为为 M提供。

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