强制对数组的调用解析为varargs调用



好吧,我有一个类似的函数

public static UnorderedList newUnorderedList(Object... items) {
return new UnorderedList(
stream(items)
.peek(e -> checkNotNull(e, "Cannot create null list item"))
.map(e -> {
if (e instanceof Component) return newListItem((Component) e);
if (e instanceof String) return newListItem((String) e);
throw new IllegalArgumentException("List item must be String or Component but is neither: " + e.getClass().getName());
}).toArray(ListItem[]::new)
);
}

(EDIT:注意:这里的UnorderedList是Vaadin对html<ul>标签的实现,我不想获得java列表。(

当您用数组调用它时,这将触发一个警告,说明您不清楚是将数组本身视为单个元素还是将其视为元素的容器。

不要马上找到一条优雅的出路。这两个我都不喜欢:

  • 始终强制转换为Object[]
  • Object...转换为Collection<Object>

是否有注释或其他东西可以让编译器知道始终将数组解析为注释方法上的vararg调用?(在方法声明上,而不是在调用站点上。(

您可以重载方法:

public static UnorderedList newUnorderedList(Object first, Object... other) {
return newUnorderedListImpl(Stream.concat(Stream.of(first), Arrays.stream(other)));
}
public static UnorderedList newUnorderedList(Object[] items) {
return newUnorderedListImpl(Arrays.stream(items));
}
private static UnorderedList newUnorderedListImpl(Stream<?> items) {
return new UnorderedList(
items
.peek(e -> checkNotNull(e, "Cannot create null list item"))
.map(e -> {
if (e instanceof Component) return newListItem((Component) e);
if (e instanceof String) return newListItem((String) e);
throw new IllegalArgumentException("List item must be String or Component but is neither: " + e.getClass().getName());
}).toArray(ListItem[]::new)
);
}

然后,对现有数组的调用将在newUnorderedList(Object[] items)结束,而实际的varargs调用将在newUnorderedList(Object first, Object... other)结束,即使只指定了一个参数,只要该参数不是数组。由于单个参数应该是StringComponent,所以这不是问题。

这两种方法失去的唯一可能性是能够在没有参数的情况下调用该方法。如果这是一个问题,您需要添加另一个过载:

public static UnorderedList newUnorderedList() {
return newUnorderedListImpl(Stream.empty());
}

您创建UnorderedList的方式不对。

假设它是一个集合:

Object[] objects = new Object[]{1, "hello", "there", "george"};
LinkedList<AtomicReference<?>> list = Arrays.stream(objects)
.filter(Objects::nonNull)
.map(e -> {
if (e instanceof Integer) return new AtomicReference<>(e);
if (e instanceof StringBuilder) return new AtomicReference<>(e);
throw new IllegalArgumentException("PAIN");
})
.collect(Collectors.toCollection(LinkedList::new));

根据你的问题,我猜你想做以下事情:

Object [] items = new Object [x];
items [0] = new Object [] {"Object1", "Object2", "Object3"};
var result = newUnorderedList( items );

在调用时,这将把带有String的数组视为一个单独的项,从而导致异常

var result = newUnorderedList( items [0] );

将为CCD_ 10返回3个元素。

没有任何注释强制将单个数组作为单个项而不是项列表进行处理。享受这样的签名:

Object function( Object [] ... );

相关内容

  • 没有找到相关文章

最新更新