Java 阵列反射

Java 阵列反射,java,reflection,arraylist,Java,Reflection,Arraylist,可能重复: 如何使用Java中的反射从ArrayList中检索Foo类型 ArrayList<Foo> myList = new ArrayList<Foo>(); 不能从值中获取此类型,但可以从字段信息中获取 public class Main { interface Foo { } class A { List<Foo> myList = new ArrayList<Foo>(); } pub

可能重复:

如何使用Java中的反射从ArrayList中检索Foo类型

ArrayList<Foo> myList = new ArrayList<Foo>();

不能从值中获取此类型,但可以从字段信息中获取

public class Main {
    interface Foo { }
    class A {
        List<Foo> myList = new ArrayList<Foo>();
    }
    public static void main(String... args) throws NoSuchFieldException {
        ParameterizedType myListType = ((ParameterizedType) 
                                A.class.getDeclaredField("myList").getGenericType());
        System.out.println(myListType.getActualTypeArguments()[0]);
    }
}
可以检查字段、方法参数、返回类型和扩展类/接口,但不能检查局部变量或值

这些都会产生相同的结果

List<Foo> myList = new ArrayList();
List<Foo> myList = (List) new ArrayList<String>();
无法获取的泛型类型

List myList = new ArrayList<Foo>();

不能从值中获取此类型,但可以从字段信息中获取

public class Main {
    interface Foo { }
    class A {
        List<Foo> myList = new ArrayList<Foo>();
    }
    public static void main(String... args) throws NoSuchFieldException {
        ParameterizedType myListType = ((ParameterizedType) 
                                A.class.getDeclaredField("myList").getGenericType());
        System.out.println(myListType.getActualTypeArguments()[0]);
    }
}
可以检查字段、方法参数、返回类型和扩展类/接口,但不能检查局部变量或值

这些都会产生相同的结果

List<Foo> myList = new ArrayList();
List<Foo> myList = (List) new ArrayList<String>();
无法获取的泛型类型

List myList = new ArrayList<Foo>();

类型擦除->无法在运行时获取泛型类型!嗯,你不能使用反射,但是,让我们跳出框框思考一下,你的ArrayList的第一个元素的类是什么^^@jlordo除非它是一个好主意,否则请看:@brunoveira不,这是一个糟糕的想法!第一个或任何其他元素可能是Foo类的后代!!!类型擦除->无法在运行时获取泛型类型!嗯,你不能使用反射,但是,让我们跳出框框思考一下,你的ArrayList的第一个元素的类是什么^^@jlordo除非它是一个好主意,否则请看:@brunoveira不,这是一个糟糕的想法!第一个或任何其他元素可能是Foo类的后代!!!如果您的列表实际位于类级别字段中,并且该字段的类型具有特定的非泛型文字类型参数,+1我必须将此信息挖出来一次。如果您的列表实际位于类级别字段中,并且该字段的类型具有特定的非泛型文字类型参数,+1我必须将此信息挖出来一次。