众所周知,有关Java集合的泛型需要E或通配符?来实例化特定集合中允许的内容/对象。

我的问题是有什么方法可以从下面的代码中知道通配符或特定集合的对象?

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

最佳答案

如果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" */
    }
  }
}

10-08 09:06