反射检查参数化类型是否为 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);
的学术案例,这肯定是所希望的调用。
我在检查参数的参数化类型时遇到问题。
我正在使用 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);
的学术案例,这肯定是所希望的调用。