2

これが私が思うように機能するかどうか知りたいです。ジェネリックは実行時にオブジェクトとして終了することを認識しています。これは私がEclipseで遭遇した問題です。Java が Collections.emptyList() のジェネリックのキャストの問題をどのように解決したかを調べているときに、この構造を見つけました。使用しているインターフェイスからリストをキャストするときに、警告を抑制することにうんざりしていました。

<T> List<T> emptyList()

割り当て時にジェネリックキャストを読んでいるように見えます。たとえば、これらはいずれも、キャスト エラーを発生させることなく機能します。

List<Object> list = Collections.emptyList();
List<MyObect> list2 = Collections.emptyList();

これがどのように機能するかについてのドキュメントを誰かに教えてもらえますか。それを検索するためにこれを何と呼ぶべきかさえわかりません。

4

3 に答える 3

1

emptyListそれが割り当てられている変数の宣言からの型を推測しています。自分で指定したい場合は、

Collections.<MyObject>emptyList();

これは、メソッドなどで役立ちArrays.asListます。このメソッドを使用すると、次のようなコードを記述できます。

List<String> myList = Arrays.asList("a", "b", "c");

ただし、 がある場合String[]、は の代わりにasListを返します。これは次のようにオーバーライドできます。List<String[]>List<String>

List<String> myList = Arrays.<String>asList(myStringArray);

ジェネリック メソッドでの型推論の詳細については、こちらを参照してください。

于 2013-03-19T21:00:40.993 に答える
0

Javaの「型推論」ドキュメントは、これに関連するほとんどの質問に答えるはずです。

型推論は、各メソッド呼び出しと対応する宣言を調べて、呼び出しを適用可能にする型引数 (または複数の引数) を決定する Java コンパイラの機能です。推論アルゴリズムは、引数の型を決定し、可能な場合は、結果が割り当てられる、または返される型を決定します。最後に、推論アルゴリズムは、すべての引数で機能する最も具体的な型を見つけようとします。

この最後の点を説明するために、次の例では、pick メソッドに渡される 2 番目の引数が型であると推論によって判断されますSerializable

static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());

あなたは変えられる

List<MyObect> list2 = Collections.emptyList();

List<MyObect> list2 = Collections.<MyObject>emptyList();

<T>にバインドする必要があることを明示的にする<MyObject>ために、変数初期化子の場合は自動的にそれを推測する必要があります。

于 2013-03-19T21:00:32.880 に答える
0

あなたが正確に何を求めているのかわからない。コンパイラが警告を出さずにキャストを実行したい場合は、コンパイラをだましてそれを行うことができます

String string = "hello";
Number number = bruteCast(string);

@SuppressWarnings("unchecked")
public static <A,B> B bruteCast(A a)
{
    return (B)(Object)a;
}

もちろん、慎重に使用する必要があります。すべての呼び出しbruteCast()が実際に正しいことを確認してください。

于 2013-03-19T21:06:29.437 に答える