【发布时间】:2014-02-05 12:33:48
【问题描述】:
我如何确定一个对象是否是泛型类的参数化类型的实例,例如ArrayList<String>?我试过了:
if(obj instanceof ArrayList<String>)
但由于编译器错误而失败!
【问题讨论】:
标签: java templates instanceof
我如何确定一个对象是否是泛型类的参数化类型的实例,例如ArrayList<String>?我试过了:
if(obj instanceof ArrayList<String>)
但由于编译器错误而失败!
【问题讨论】:
标签: java templates instanceof
简而言之,由于类型擦除,您不能/不应该这样做。 参数化类型仅在编译时存在,而不是在运行时存在。因此,您无法在运行时通过泛型和参数化类型来确保类型安全。它们的存在是为了确保编程时的类型安全,但是在程序运行时所有此类类型信息都已消失,因为类型已被替换视情况而定,剩下的是非参数化的正常类。充其量,您可以执行以下操作:
obj instanceof ArrayList
检查obj 是否是ArrayList 的实例并且:
obj.get(0) instanceof String
检查ArrayList中存储的对象是否为String的实例。当然,您可能要先检查是否有任何元素。
或者,您可以使用反射(例如参见 ParametrizedType 接口中的 getActualTypeArguments())。
【讨论】:
因为在 java 中运行时不会有任何泛型。所以编译器不允许这种逻辑。
【讨论】: