Java 中 Object 对象的实际类型
Java 中 Object 对象的实际类型
如果是不是泛型类,直接通过 Object.getClass 就可以拿到实际的类型。如果是泛型,那么通过反射啥的其实是拿不到声明类型的,例如下面的测试代码
public static void main(String[] args) {
// 这样是不可以的
Object obj = Lists.newArrayList("Hello", "World");
// 这样是可以的判断的,但是日常我们不是这么用的
// Object obj = new ArrayList<String>() {{
// add("sdfs"); // }};
// 不行
if (obj instanceof List) {
List<?> list = (List<?>) obj;
Type type = list.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] typeArguments = parameterizedType.getActualTypeArguments();
if (typeArguments.length > 0 && typeArguments[0].equals(String.class)) {
System.out.println("The object is a List<String>.");
} else {
System.out.println("The object is a List, but not necessarily a List<String>.");
}
} else {
System.out.println("The object is a List, but not necessarily a List<String>.");
}
} else {
System.out.println("The object is not a List.");
}
TypeToken<List<String>> typeToken = new TypeToken<List<String>>() {
};
if (typeToken.isAssignableFrom(obj.getClass())) {
System.out.println("The object is a List<String>.");
} else {
System.out.println("The object is not a List<String>.");
}
}
一个很简答的方法是直接获取里面的元素,然后拿到元素的类型即可
public static void main(String[] args) {
Object strObj = new String("sdfs");
// 输出 class java.lang.String System.out.println(strObj.getClass());
// 如果是泛型类型的话,上面的这些例子都没用,只能拿到元素,然后再判断元素类型
Object obj = Lists.newArrayList("Hello", "World");
if (obj instanceof List) {
List listObj = (List) obj;
Object o = listObj.get(0);
Class<?> typeParam = o.getClass();
CollectionType collectionType = new ObjectMapper().getTypeFactory().constructCollectionType(List.class, typeParam);
System.out.println(collectionType);
}
}