如何解决反射检查参数化类型是否为字符串和对象
检查参数的参数化类型时遇到问题。
我使用method.getGenericParameterTypes()
并将其强制转换为ParameterizedType
只是为了检查参数是否正确Map
,但是当我检查类型时,我得到的是String,?
而不是{ {1}},对于字符串,很容易使用String,Object
进行检查,但是对于String.class.equals(type[0])
,执行?
将返回false。
是否有更好的方法来检查参数化类型是否为Object.class.equals(type[1])
?
解决方法
参数化类型是 ?
,而不是对象。这些根本不是一回事。
您可以在map.put("Hello",new Object());
上致电Map<String,Object>
。不可能在map.put
* 上完全调用Map<String,?>
。
如果需要Map<String,Integer>
,则可以将类型Map<String,?>
的表达式作为参数传递给方法。您不能传递Map<String,Object>
。您也无法将Map<String,Integer>
传递给需要Map<String,Object>
的方法(因为如果可以,则可以在其中放置new Object()
并破坏所有内容)。
此外请注意,您的计划非常脆弱,无法涵盖泛型试图涵盖的大多数情况。例如,如果您有:
public class Foo<T> {
private final Map<T,Object> map = new HashMap<>();
}
然后针对new Foo<String>()
,实际上该地图就是您想要的地图,但是您的支票将找到T
,显然不是String。泛型没有具体化。您无法使用.getGenericType()
来解决它-您尝试做的任何事情可能永远都行不通,并且您需要重新考虑您的方法。
?
将是WildcardType
的实例;将其投放,然后要求下限。对象应该在其中(实际上,?
仅是下界)。除了对所有存在的所有不同类型进行instanceof检查并为每个类型编写自定义代码之外,您没有什么可以做的。您会发现您的问题(例如,我可以通过new Object()
而不会破坏事物)对于其中的某些问题是无法回答的,例如当它是java.lang.reflect.TypeVariable
的实例时。
*)除map.put("Hello",null);
的学术案例外,肯定是您希望拨打的电话。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。