反射检查参数化类型是否为 String 和 Object

Reflection check if parameterized type is String and Object

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

我正在使用 method.getGenericParameterTypes() 并将其转换为 ParameterizedType 只是为了检查参数是否正确 Map 但是当我检查类型时我得到的是 String, ? String, Object,对于字符串,使用 String.class.equals(type[0]) 很容易检查,但是对于 ?,执行 Object.class.equals(type[1]) 将 return false。

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

参数化类型?,不是Object。这些根本不是一回事。

您可以在 Map<String, Object> 上呼叫 map.put("Hello", new Object());。在 Map<String, ?>*.

上根本无法调用 map.put

您可以将 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,这显然不是字符串。泛型没有具体化。你不能用 .getGenericType() 绕过它 - 无论你想做什么都可能永远不会奏效,你需要重新考虑你的方法。

A ? 将是 WildcardType 的实例;把它投给那个,然后要求下限。对象应该在其中(实际上,仅 ?,这将是唯一的下限)。除了对存在的所有不同类型进行 instanceof 检查并为每个类型编写自定义代码之外,您无能为力。您会发现您的问题 ('can I pass new Object() without breaking things, for example') 对于其中一些是无法回答的,例如当它是 java.lang.reflect.TypeVariable.

的一个实例时

*) 除了 map.put("Hello", null); 的学术案例,这肯定是所希望的调用。