反映通用类

时间:2012-12-04 18:21:48

标签: java generics reflection

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

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

示例代码应打印:

  

Dimension = 2和Bottom type = class java.lang.Float
  Dimension = 3,Bottom type = class 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);

对此进行评论:

如果你有一个带有字段的对象

,这很有趣
  ArrayList<ArrayList<Float>>

然后你可以编写方法

  void analyzeArrayList(Field s)

如果你知道Field s代表ArrayList。

1 个答案:

答案 0 :(得分:1)

由于type erasure,这是不可能的。

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