可変引数呼び出しとして解決するには、アレイとの通話を強制

User1291:

さてさて、私はのような機能を持っています

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ここでは、HTMLののVaadinの実装である<ul>私は、Javaのリストを取得しようとしていないよ、タグ。)

これは、あなたがそれはあなたが単一の要素として、または要素のコンテナとして配列自体を扱いたいかどうかは不明だと言っ配列とそれを呼び出す警告をトリガします。

すぐにこのうちのエレガントな方法を参照してくださいしないでください。これらのどちらも好きです。

  • いつもにキャスト Object[]
  • ターンObject...Collection<Object>

常に注釈付きメソッドの可変引数呼び出しにアレーを解決するために、コンパイラのノウハウを聞かせ注釈か何かはありますか?(メソッド宣言ではなく、呼び出しサイトで。)

ホルガー:

あなたは、メソッドをオーバーロードすることができます:

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)実際の可変引数呼び出しがで終わるだろう一方でnewUnorderedList(Object first, Object... other)一つだけの引数があれば、その引数が配列でないとして、指定された場合でも、。単一の引数がいずれかのことになっているので、StringまたはComponent、これは問題ではありません。

これらの2つの方法で失われた唯一の可能性は、引数なしでメソッドを呼び出す機能です。これが問題である場合は、別のオーバーロードを追加する必要があります。

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=367286&siteId=1