1

特定のコレクションで許可されたコンテンツ/オブジェクトをインスタンス化するには、 Java コレクションに関するジェネリックEまたはワイルドカードが必要であることは周知のとおりです。?

私の質問は、以下のコードから特定のコレクションのワイルドカードまたはオブジェクトを知る方法はありますか?

Object inbound = java.io.ObjectInputStream().readObject();
if(inbound instanceof List<?>) {
   // know `?.getClass()`
}
4

4 に答える 4

6

いいえ。型消去のため、実行時に s を区別する方法はありませんList

于 2012-08-27T17:02:31.063 に答える
2

inboundが型宣言で型パラメーターを定義するクラスである場合にのみ、型パラメーターを見つけることができます。たとえば、次のNodeListように宣言された のインスタンスをシリアライズしたとします。

final class NodeList extends ArrayList<Node> { }

次に、デシリアライズすると、次のことができます。

Object inbound = ois.readObject();
if (inbound instanceof List<?>) {
  Type t = inbound.getClass().getGenericSuperclass();
  if (t instanceof ParameterizedType) {
    ParameterizedType pt = (ParameterizedType) t;
    for (Type p : pt.getActualTypeArguments()) {
      if (p instanceof TypeVariable<?>)
        System.out.println("Unknown");
      else
        System.out.println(p); /* Prints "interface Node" */
    }
  }
}
于 2012-08-27T17:38:29.530 に答える
0

リストに少なくとも1つの要素が含まれていることが確実な場合は、それを呼び出すことができますgetClass

そうでなければ、これは実際には不可能ですが、リストとともに正しいClassオブジェクトをシリアル化することはできます。

于 2012-08-27T17:24:21.827 に答える
0

私見、これを行う必要がある場合の最善の解決策は、Guice を使用することです: http://blog.publicobject.com/2008/11/guice-punches-erasure-in-face.html

他の人が述べたように、型の消去が問題の原因です。適切な説明はhttp://docs.oracle.com/javase/tutorial/java/generics/erasure.htmlにあります。

のソースをArrayList見て、これがどのように機能するかの例を見ることができます。は(行 111)ArrayListを保持しています。Object[]オブジェクトのタイプはわかりません。371 行目などのように、「タイプ セーフ」は実際にはキャストを介して実現されていることがわかります。

于 2012-08-27T17:47:55.300 に答える