猿问

获取java.util.List的泛型类型

获取java.util.List的泛型类型

我有;

List<String> stringList = new ArrayList<String>();List<Integer> integerList = new ArrayList<Integer>();

是否有一种(容易)的方法来检索列表的泛型类型?


撒科打诨
浏览 4936回答 3
3回答

莫回无

如果这些字段实际上是某个类的字段,那么您可以通过一些反射得到它们:package&nbsp;test;import&nbsp;java.lang.reflect.Field;import&nbsp;java.lang.reflect.ParameterizedType;import&nbsp;java.util.ArrayList;import&nbsp;java.util.List; public&nbsp;class&nbsp;Test&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;List<String>&nbsp;stringList&nbsp;=&nbsp;new&nbsp;ArrayList<String>(); &nbsp;&nbsp;&nbsp;&nbsp;List<Integer>&nbsp;integerList&nbsp;=&nbsp;new&nbsp;ArrayList<Integer>(); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String...&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;stringListField&nbsp;=&nbsp;Test.class.getDeclaredField("stringList"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParameterizedType&nbsp;stringListType&nbsp;=&nbsp;(ParameterizedType)&nbsp;stringListField.getGenericType(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class<?>&nbsp;stringListClass&nbsp;=&nbsp;(Class<?>)&nbsp;stringListType.getActualTypeArguments()[0]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stringListClass);&nbsp;//&nbsp;class&nbsp;java.lang.String. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;integerListField&nbsp;=&nbsp;Test.class.getDeclaredField("integerList"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParameterizedType&nbsp;integerListType&nbsp;=&nbsp;(ParameterizedType)&nbsp;integerListField.getGenericType(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class<?>&nbsp;integerListClass&nbsp;=&nbsp;(Class<?>)&nbsp;integerListType.getActualTypeArguments()[0]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(integerListClass);&nbsp;//&nbsp;class&nbsp;java.lang.Integer. &nbsp;&nbsp;&nbsp;&nbsp;}}对于参数类型和方法的返回类型,也可以这样做。但是,如果它们在类/方法的相同范围内,您需要了解它们,那么就没有必要知道它们,因为您已经自己声明了它们。

慕村9548890

简短回答:不。这可能是个复制品,现在找不到合适的。Java使用的是类型擦除,这意味着在运行时这两个对象是等价的。编译器知道列表包含整数或字符串,因此可以维护类型安全环境。此信息(基于对象实例)在运行时丢失,列表仅包含“对象”。您可以稍微了解一下这个类,它可能被参数化的类型,但是通常这只是扩展“Object”的任何东西,也就是任何东西。如果将类型定义为class&nbsp;<A&nbsp;extends&nbsp;MyClass>&nbsp;AClass&nbsp;{....}类将只包含参数A由MyClass限定的事实,但更重要的是,无法判断。

慕姐8265434

您也可以对方法参数执行相同的操作:Type[]&nbsp;types&nbsp;=&nbsp;method.getGenericParameterTypes(); //Now&nbsp;assuming&nbsp;that&nbsp;the&nbsp;first&nbsp;parameter&nbsp;to&nbsp;the&nbsp;method&nbsp;is&nbsp;of&nbsp;type&nbsp;List<Integer>ParameterizedType&nbsp;pType&nbsp;=&nbsp;(ParameterizedType)&nbsp;types[0]; Class<?>&nbsp;clazz&nbsp;=&nbsp;(Class<?>)&nbsp;pType.getActualTypeArguments()[0];System.out.println(clazz);&nbsp;//prints&nbsp;out&nbsp;java.lang.Integer
随时随地看视频慕课网APP

相关分类

Java
我要回答