java - 反射检查参数化类型是否为字符串和对象
问题描述
检查参数的参数化类型时遇到问题。
我正在使用method.getGenericParameterTypes()
并将其转换为ParameterizedType
简单地检查参数是否正确Map
但是当我检查我得到的类型String, ?
而不是 时String, Object
,对于字符串来说很容易检查,String.class.equals(type[0])
但是?
做Object.class.equals(type[1])
将返回 false。
有没有更好的方法来检查参数化类型是否为Object
?
解决方案
参数化类型是 ?
,而不是 Object。这些根本不是一回事。
您可以调用map.put("Hello", new Object());
. 根本Map<String, Object>
不可能调用*。map.put
Map<String, ?>
您可以将类型表达式Map<String, Integer>
作为参数传递给方法,如果它需要Map<String, ?>
. 你不能通过Map<String, Object>
. 您也不能将 a 传递给Map<String, Integer>
需要 a 的方法Map<String, Object>
(因为如果可以,您可以将 anew Object()
放在那里,然后破坏一切)。
此外请注意,您的计划非常脆弱,并没有涵盖仿制药试图涵盖的大多数情况。例如,如果您有:
public class Foo<T> {
private final Map<T, Object> map = new HashMap<>();
}
然后,例如,new Foo<String>()
地图实际上是您想要的地图,但您的检查会发现T
,这显然不是字符串。泛型没有具体化。你无法绕过它.getGenericType()
——无论你试图做什么,都可能永远不会奏效,你需要重新考虑你的方法。
A?
将是WildcardType
; 将其转换为那个,然后要求下限。对象应该在其中(?
实际上,这将是唯一的下限)。除了对存在的所有许多不同类型的类型进行 instanceof 检查并为每种类型编写自定义代码之外,您无能为力。您会发现您的问题(例如,“我可以在new Object()
不破坏事物的情况下通过吗”)对于其中一些问题是无法回答的,例如当它是java.lang.reflect.TypeVariable
.
*)除了学术案例,map.put("Hello", null);
这肯定是需要的电话。
推荐阅读
- angular - 如何配置 Jhipster 现有应用程序以使用“ng build”构建?
- excel - 使用嵌入在单元格文本中的变量
- sql - 获取上个月的交易,无论日期和时间
- python - 如何使用 Python 从指向子 URL 的 URL 下载 pdf 文件
- typescript - Typescript 模块中的动态导出
- sql - 位于两个日期之间的 SQL 总和
- javascript - Phaser:如何为 this.image.load 设置回退
- laravel - Vuejs 安装与否?
- javascript - 响应式导航栏(vanilla javascript)不起作用
- c# - 使用没有 VBA 的 OpenXML 库 VS2017 在 Office Excel 中自动插入自定义功能区