1. ホーム
  2. java

[解決済み] Javaジェネリックの「?」と「Object」の違いは何ですか?

2022-04-28 11:33:19

質問

Eclipseを使って、Javaのジェネリックスを適切に使用できるようにコードを整理しています。 ほとんどの場合、Eclipse は優れた方法で型を推論しますが、推論される型が可能な限りジェネリックでなければならないケースもあります。オブジェクトです。 しかし、Eclipseは、Objectの型と''の型のどちらかを選択するオプションを与えているようです。

では、何が違うのか。

HashMap<String, ?> hash1;

そして

HashMap<String, Object> hash2;

解決方法は?

のインスタンスは HashMap<String, String> マッチ Map<String, ?> ただし Map<String, Object> . からマップを受け取るメソッドを書きたいとします。 String を何にでも使えます。

public void foobar(Map<String, Object> ms) {
    ...
}

を指定することはできません。 HashMap<String, String> . もしあなたが

public void foobar(Map<String, ?> ms) {
    ...
}

うまくいった

Javaのジェネリックスで時々誤解されるのが List<String> のサブタイプではありません。 List<Object> . (ただし String[] のサブタイプです。 Object[] これがジェネリックと配列の相性が悪い理由のひとつです。(Javaの配列は共変であり、ジェネリックスはそうではなく、それらは 不変 )).

サンプルです。 を受け付けるメソッドを書きたい場合は、以下のようにします。 ListInputStream のサブタイプであり InputStream と書くと、次のようになります。

public void foobar(List<? extends InputStream> ms) {
    ...
}

ところで Joshua BlochのEffective Java は、Javaの単純でない部分を理解するのに最適なリソースです。(上の質問もこの本の中で非常によくカバーされています)。