接口泛型和instanceof

时间:2013-05-25 16:56:54

标签: java generics interface instanceof

我的界面有一个泛型类型参数。任何实现接口的类都必须声明这种类型,因此后来的用户将知道它们返回的内容。现在,我需要对这些类上的instanceof进行检查,看看它们是否是Action的一个实例。

我的问题是:如果我这样做将返回instanceof:

if (SomeAction instanceof Action<?>) {
    . . .

}

使用此SomeAction类:

public class SomeAction implements Action<String> {
    . . .

}

它会返回true还是false?如果我做SomeAction instanceof Action<Integer>

怎么办?

2 个答案:

答案 0 :(得分:3)

当您使用instanceof时,Java不关心泛型类型。引用Javadocs

  

因为Java编译器会删除通用代码中的所有类型参数,所以无法验证在运行时使用泛型类型的参数化类型

因此,您可以针对Action<?>Action进行测试,但如果您尝试针对Action<Integer>进行测试,则会出现编译器错误。错误消息非常有用:

  

无法对参数化类型Action&lt; Integer&gt;执行instanceof检查。使用表单Action&lt;?&gt;相反,因为在运行时将删除其他通用类型信息

答案 1 :(得分:0)

我实现了它,它返回true。

另外如果你把所有的泛型遗漏在一起,就像这样:

if (SomeAction instanceof Action) {
    . . .

}

如果您尝试在 if 操作中实际包含Action的泛型类型,则代码无法编译,并显示以下消息:

  

非法泛型类型,例如

例如:

if (action instanceof Action<String>) {
            System.out.println("is Action");
} else {
            System.out.println("is not Action");
}