我有一个类型的对象:Optional<String>
,我想知道在运行时Optional
的泛型类型是什么-意思是'字符串'。
我试过:
obj.getClass()
返回java.util.Optional
then I try,
obj.getParameterizedType();
但是这不会返回它有Class<> object
任何想法?
不存在Optional<String>
类型的对象。类型擦除意味着在执行时只有 Optional
。如果您有一个Optional<String>
类型的字段或参数,信息可以在执行时检索-但是对象本身并不知道它。
基本上,Optional<>
在这里没有什么特别的-它与使用List<>
有相同的限制…虽然它是最终的,但你甚至不能使用任何像Guava的TypeToken
这样的东西所使用的变通方法。
关于类型擦除的更多细节,请参阅Java泛型常见问题解答。
正如其他答案所指出的,如果您拥有的只是可选对象的实例,那么您就不走运了。但是,如果对象的类定义了Optional属性,则可以这样做:
Class clazz = (Class) ((ParameterizedType) MyClass.class.getDeclaredField("name-of-optional-field").getGenericType()).getActualTypeArguments()[0];
正如Jon Skeet在回答中解释的那样,不能简单地检索泛型类型。一种解决方法可能是这样的:
Class<?> type = null;
if(optional.isPresent()) {
type = optional.get().getClass();
}
当然,当Optional为空时,这不会有帮助,但在某些情况下,它可以工作。