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

时间:2014-06-11 09:12:53

标签: java reflection

我有一个类型为Optional<String>的对象,我想在运行时知道什么是Optional的泛型类型 - 意思是'字符串'。

我试过了:

obj.getClass()

但这会返回java.util.Optional

然后我试过了,

obj.getParameterizedType();

但这不会返回它有Class&lt;&gt;对象

任何想法??

3 个答案:

答案 0 :(得分:5)

没有Optional<String>类型的对象。类型擦除意味着执行时 Optional。如果您有一个Optional<String>类型的字段或参数,可以在执行时检索信息 - 但对象本身并不知道它。

基本上,这里Optional<>并没有什么特别之处 - 它与使用List<>具有相同的局限性......虽然它是最终的,但您甚至无法使用任何事情所使用的变通方法像Guava的TypeToken

有关详细信息,请参阅Java Generics FAQ on Type Erasure

答案 1 :(得分:1)

正如Jon Skeet的回答中所解释的那样,你不能简单地检索泛型类型。一种解决方法可能是这样的:

Class<?> type = null;
if(optional.isPresent()) {
    type = optional.get().getClass();
}

当然,当Optional为空时,这将无济于事,但在某些情况下,它可以正常工作。

答案 2 :(得分:1)

正如其他答案所指出的那样,如果您拥有的只是Optional对象的实例,那么您将失去运气。 但是,如果您拥有定义Optional属性的对象的类,则可以执行以下操作:

Class clazz = (Class) ((ParameterizedType) MyClass.class.getDeclaredField("name-of-optional-field").getGenericType()).getActualTypeArguments()[0];

它很丑,但它确实有效。