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);  
    }  
}