Java8:如何获得java.util.Optional类的内部类型



我有一个类型的对象: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为空时,这不会有帮助,但在某些情况下,它可以工作。

相关内容

  • 没有找到相关文章

最新更新