将可选对象作为varags传递给参数?

时间:2019-09-09 18:00:29

标签: java-8 optional

我想将多个可选对象作为varags传递给函数吗?

Optional<ab> ab = Optional.of(ab);
Optional<cd> cd = Optional.of(cd);
Optional<dc> dc = Optional.of(dc);
Optional<ba> ba = Optional.of(ba);
data(ab, cd, dc, ba);
data(Optional<Object>... objects){...}

如果我这样做我会出错,任何建议如何进行?

1 个答案:

答案 0 :(得分:1)

它与可变参数无关。您不能在期望Optional<SomeSpecificType>的地方传递Optional<Object>。它们不兼容。

假设(不包含可变参数)

static void data(Optional<Object> object) {
    // …
}

现在,如果我们尝试

    Optional<String> ab = Optional.of("");
    data(ab);

在我的Eclipse中,我收到以下错误消息:

  

类型为MyClass的方法数据(可选)不是   适用于参数(可选

Java泛型具有此限制。您也无法通过,例如List<String>会出现List<Object>

您也可以通过声明通用方法来克服限制:

static <T> void data(Optional<T> object) {
    // …
}

或者就是这样:

static void data(Optional<?> object) {
    // …
}

使用这两个声明中的任何一个,上面的调用都可以。

顺便说一句,@ HadiJ在注释中是正确的:Optional用于表示可能存在或不存在的方法的返回值。它们几乎没有其他很好的用途,因为参数不是其中之一。在我看来,对于您的用例,您应该只传递存在的参数,而忽略不存在的参数。您的data方法可能会收到一个更长或更短的参数数组,但只需要处理该数组的所有元素而不必关心Optional。将StringIntegerLocalDate等传递到声明为void data(Object... objs)的方法很简单,也没有问题。