Java 反映泛型类
我认为这是不可能的,但让我们试试: 是否可以编写例程analyzeArrayList() 以这样的方式打印ArrayList的维度 和列表的类型 示例代码应打印: 维度=2,底部类型=class java.lang.FloatJava 反映泛型类,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;
维度=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)