首页 > 解决方案 > 反射检查参数化类型是否为字符串和对象

问题描述

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

我正在使用method.getGenericParameterTypes()并将其转换为ParameterizedType简单地检查参数是否正确Map但是当我检查我得到的类型String, ?而不是 时String, Object,对于字符串来说很容易检查,String.class.equals(type[0])但是?Object.class.equals(type[1])将返回 false。

有没有更好的方法来检查参数化类型是否为Object

标签: javagenericsreflectionparameterized-types

解决方案


参数化类型 ?,而不是 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);这肯定是需要的电话。


推荐阅读