1

一連のパラメーターを取得して配列を返す便利なメソッドが必要です。これは、一連のパラメーターを取得してそれらのアイテムArrays.asList(T... items)を返すのと同じです。List<T>

書くのは簡単ですが、Java には既に存在しますか?

更新 悪い!質問がとても不明確であることに気づきませんでした。あなたの質問により、その質問は私が思っていた質問とはまったく違うことに気がつきました。

さまざまなキー/値をマップに配置する次のような呼び出しがいくつかあります。

        put( Key.get(A.class), new Key[] { Key.get(X.class), Key.get(Y.class), Key.get(Z.class)});

... マップのタイプMap<Key<? extends Foo>,Key<? extends Foo>[]>

上記のステートメントを実行するタイプセーフで簡潔な方法を探していましたが、次のようなものがうまくいくと思いました。

        put( Key.get(A.class), toArray( Key.get(X.class), Key.get(Y.class), Key.get(Z.class)));

...どこtoArray()で次のように定義されます

private static <T> T[] toArray( T... t ) {
    return t;
}

ただし、このソリューション自体はタイプセーフではないことが判明したため、new. これが私の誤解の最初の原因でした。

配列の代わりにリストを使用し、リストの値を入力するために使用することでタイプセーフを取得できると考えましたArrays.asList()が、それもタイプセーフではないことがわかりました。これが私の誤解の第二の原因でした。これにより、このステートメントは実際よりも簡潔になると考えたArrays.asList()ので、配列に対して同じことを行うものを探していました。

したがって、質問は本当に-上記の状況でタイプセーフを取得する簡潔な方法はありますか?

4

5 に答える 5

9

配列にはすでに次のようなショートカット構文があります。

String[] strArray = {"one", "two", "three"};

あなたの更新に応じて:

あなたが発見したように、パラメータ化された型の配列は決して型安全ではありません。これは、配列とジェネリックが水と油のようなものであるため、いくつかの制限の 1 つです。

varargs はコンマ区切りの引数の配列を暗黙的に作成することによって機能するため、などの varargs メソッドArrays.asListはこの制限から免れられません。タイプ セーフを確保するには、varargs を含む配列を含むソリューションを避ける必要があります。

まず、マップのタイプを変更してList、配列ではなく sを保持することをお勧めします。

Map<Key<? extends Foo>, List<Key<? extends Foo>>> map = new HashMap<>();

そして、Listに入れる前に a をビルドしMapます。

List<Key<? extends Foo>> lst = new ArrayList<>();
lst.add(Key.get(X.class));
lst.add(Key.get(Y.class));
lst.add(Key.get(Z.class));
map.put(Key.get(A.class), lst);

すべてを 1 つのステートメントにまとめたい場合は、varargs を使用しないとややこしくなります。Guavaは、 varargs にフォールバックする前に最大 12 個の要素を使用ImmutableListするファクトリ メソッドを公開します。マップ内の が後で変更されない場合は、次を保存して使用できofます。ListImmutableList<Key<? extends Foo>>

map.put(
    Key.get(A.class),
    ImmutableList.of(Key.get(X.class), Key.get(Y.class), Key.get(Z.class))
);

List実際、返された をコピーして変更可能にする必要がある場合でも、これらのファクトリ メソッドを利用できますImmutableList

map.put(
    Key.get(A.class),
    Lists.newArrayList(ImmutableList.of(
        Key.get(X.class),
        Key.get(Y.class),
        Key.get(Z.class)
    ))
);

しかし、スタイルのためだけにオーバーヘッドを導入しています。


補足: たまたま Guava を使用している場合は、s の代わりに a を使用することを検討してMultimapください。MapList

于 2012-07-03T18:52:23.247 に答える
1

これは、あなたの望むことですか?Javaは varargs 構造を配列として扱うため、これは配列を返します。しかし、それを一般化する方法がわかりません。

public Object argsToArray(Object... args) {
return args;
}
于 2012-07-03T19:10:08.013 に答える
1

を取得しSetて返すには、List次を使用できますArrayList

Set<String> set = new HashSet<String>();
set.add("str1");
set.add("str2");
set.add("str3");

List<String> list = new ArrayList<String>(set);

リストから配列が必要な場合は、次のようにすることができます。

myList.toArray();
// or even
String[] myStringArray = myList.toArray(new String[]);
于 2012-07-03T19:00:41.947 に答える
1

このようなメソッドは、配列のコンストラクターがまだ行っていないことを何をしますか?

String foo = "FOO";
String bar = "BAR";
String[] strings = new String[]{foo, bar};
于 2012-07-03T18:53:18.967 に答える
1

どうですか

public static class ToArray {
    public static <T> T[] toArray(T... items) {
        return items;
    }                
}

public void example() {
    String[] strings = ToArray.toArray("fred", "bob");
}

?

于 2012-07-03T18:58:41.253 に答える