Java 反映泛型类

Java 反映泛型类,java,generics,reflection,Java,Generics,Reflection,我认为这是不可能的,但让我们试试: 是否可以编写例程analyzeArrayList() 以这样的方式打印ArrayList的维度 和列表的类型 示例代码应打印: 维度=2,底部类型=class java.lang.Float 维度=3,底部类型=类java.lang.Integer 我们假设参数s始终是ArrayList的实例, 不是其他类型的实例。请注意,列表可以为空,但不能为空 void analyzeArrayList(Object s) { int dimension;

我认为这是不可能的,但让我们试试:

是否可以编写例程analyzeArrayList() 以这样的方式打印ArrayList的维度 和列表的类型

示例代码应打印:

维度=2,底部类型=class java.lang.Float
维度=3,底部类型=类java.lang.Integer

我们假设参数s始终是ArrayList的实例, 不是其他类型的实例。请注意,列表可以为空,但不能为空

  void analyzeArrayList(Object s)
  {
    int dimension;
    String typeString;

    //<Some code here!>

    System.out.println("Dimension = "+dimension+" and Bottom type = "+typeString);
  }



  Object s = new ArrayList<ArrayList<Float>>();
  Object t = new ArrayList<ArrayList<ArrayList<Integer>>>();

  .
  . 
  analyzeArrayList(s);
  analyzeArrayList(t);
如果您知道字段s代表ArrayList。

由于以下原因,无法使用该字段

Java只在编译时考虑泛型。如果您有一个
列表
列表
,编译器知道这些列表来自不同的类型,这使得它能够基于每个实例创建某种类型的类型安全环境。由于类型擦除,在运行时两个列表都包含对象,并且彼此等效。

这是不可能的,因为


Java只在编译时考虑泛型。如果您有一个
列表
列表
,编译器知道这些列表来自不同的类型,这使得它能够基于每个实例创建某种类型的类型安全环境。由于类型擦除,在运行时,这两个列表似乎都包含对象,并且彼此等效。

您可以使用递归来找到底部,然后使用
value.getClass()
来确定类型。@Knownasilya-如果为空则不起作用。我认为如果它是空的就不可能了…不可能。正如我所说,列表可能是空的(或者内部级别部分为空)。类型擦除使其不可能。我错过了它提到的可以为空的部分。是的,我认为这是不可能的。你可以使用递归找到最底层,然后使用
value.getClass()
找出类型。@Knownasilya-如果它是空的,则不起作用。我认为如果它是空的就不可能了…不可能。正如我所说,列表可能是空的(或者内部级别部分为空)。类型擦除使其不可能。我错过了它提到的可以为空的部分。是的,我认为这不可能。
  ArrayList<ArrayList<Float>>
  void analyzeArrayList(Field s)