微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反射检查参数化类型是否为字符串和对象

如何解决反射检查参数化类型是否为字符串和对象

检查参数的参数化类型时遇到问题。

我使用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 举报,一经查实,本站将立刻删除。