如何确定对象是否是泛型类的参数化类型的实例,例如ArrayList<String>
?我试过了:
if(obj instanceof ArrayList<String>)
但是编译错误失败了!
答案 0 :(得分:3)
简而言之,由于类型擦除,您不能/不应该这样做。 参数化类型仅在编译时存在,而不是在运行时。所以你不能在运行时通过泛型和参数化类型确保类型安全。它们是为了确保编程时的类型安全,但所有这些类型信息在程序运行时都消失了,因为类型被替换适当的,你剩下的是非参数化的普通类。充其量,你可以这样做:
obj instanceof ArrayList
检查obj
是否为ArrayList
的实例,并且:
obj.get(0) instanceof String
检查ArrayList
中存储的对象是否为String
的实例。当然,您可能想先检查是否有任何元素。
或者,您可以使用反射(例如参见ParametrizedType接口中的getActualTypeArguments())。
答案 1 :(得分:1)
因为在java中运行时不会有任何泛型。因此编译器不会允许这种逻辑。