我有一个类型为Optional<String>
的对象,我想在运行时知道什么是Optional
的泛型类型 - 意思是'字符串'。
我试过了:
obj.getClass()
但这会返回java.util.Optional
然后我试过了,
obj.getParameterizedType();
但这不会返回它有Class&lt;&gt;对象
任何想法??
答案 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];
它很丑,但它确实有效。