instanceof for java中的模板类型

时间:2014-02-05 12:33:48

标签: java templates instanceof

如何确定对象是否是泛型类的参数化类型的实例,例如ArrayList<String>?我试过了:

if(obj instanceof ArrayList<String>)

但是编译错误失败了!

2 个答案:

答案 0 :(得分:3)

简而言之,由于类型擦除,您不能/不应该这样做。 参数化类型仅在编译时存在,而不是在运行时。所以你不能在运行时通过泛型和参数化类型确保类型安全。它们是为了确保编程时的类型安全,但所有这些类型信息在程序运行时都消失了,因为类型被替换适当的,你剩下的是非参数化的普通类。充其量,你可以这样做:

obj instanceof ArrayList

检查obj是否为ArrayList的实例,并且:

obj.get(0) instanceof String

检查ArrayList中存储的对象是否为String的实例。当然,您可能想先检查是否有任何元素。

或者,您可以使用反射(例如参见ParametrizedType接口中的getActualTypeArguments())。

答案 1 :(得分:1)

因为在java中运行时不会有任何泛型。因此编译器不会允许这种逻辑。