我有;
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
是否有(简单)方法检索列表的泛型类型?
我有;
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
是否有(简单)方法检索列表的泛型类型?
当前回答
在运行时,不可以。
但是,通过反射可以访问类型参数。试一试
for(Field field : this.getDeclaredFields()) {
System.out.println(field.getGenericType())
}
方法getGenericType()返回一个Type对象。在这种情况下,它将是一个paramtrizedtype的实例,它又有方法getRawType()(在这种情况下,它将包含List.class)和getActualTypeArguments(),它将返回一个数组(在这种情况下,长度为1,包含String.class或Integer.class)。
其他回答
在运行时,不可以。
但是,通过反射可以访问类型参数。试一试
for(Field field : this.getDeclaredFields()) {
System.out.println(field.getGenericType())
}
方法getGenericType()返回一个Type对象。在这种情况下,它将是一个paramtrizedtype的实例,它又有方法getRawType()(在这种情况下,它将包含List.class)和getActualTypeArguments(),它将返回一个数组(在这种情况下,长度为1,包含String.class或Integer.class)。
有同样的问题,但我使用instanceof代替。是这样做的:
List<Object> listCheck = (List<Object>)(Object) stringList;
if (!listCheck.isEmpty()) {
if (listCheck.get(0) instanceof String) {
System.out.println("List type is String");
}
if (listCheck.get(0) instanceof Integer) {
System.out.println("List type is Integer");
}
}
}
这涉及到使用未检查的类型转换,所以只有在知道它是一个列表以及它可以是什么类型时才这样做。
我找到了一个非常适合我的答案。
class ArrayListString extends ArrayList<String> {}
class ArrayListInteger extends ArrayList<Integer> {}
ArrayListString als = new ArrayListString();
ArrayListInteger ali = new ArrayListInteger();
void whatType(Object a) {
if (a instanceof ArrayListString)
System.out.println("ArrayListString");
else if (a instanceof ArrayListInteger)
System.out.println("ArrayListInteger");
}
whatType(als);
whatType(ali);
Als和ali将像它们的泛型一样工作。
这段代码所做的是将泛型类型转换为常规Java类型。在Java中,可以使用instanceof检测常规类型。
正如其他人所说,唯一正确的答案是否定的,该类型已被删除。
如果列表的元素数目非零,则可以研究第一个元素的类型(例如,使用它的getClass方法)。这不会告诉您列表的泛型类型,但可以合理地假设泛型类型是列表中类型的某个超类。
我不提倡这种方法,但在遇到困难时,它可能会有用。
简单的回答是:不。
这可能是复制品,现在找不到合适的。
Java使用类型擦除,这意味着在运行时两个对象是等价的。编译器知道列表包含整数或字符串,因此可以维护类型安全的环境。这些信息在运行时丢失(以对象实例为基础),并且列表只包含“对象”。
你可以找到一些关于类的信息,它可能被参数化的类型,但通常这只是任何扩展“对象”的东西,即任何东西。如果将类型定义为
class <A extends MyClass> AClass {....}
class将只包含参数A受MyClass限制的事实,但除此之外,没有办法告诉它。