我的界面有一个泛型类型参数。任何实现接口的类都必须声明这种类型,因此后来的用户将知道它们返回的内容。现在,我需要对这些类上的instanceof进行检查,看看它们是否是Action的一个实例。
我的问题是:如果我这样做将返回instanceof:
if (SomeAction instanceof Action<?>) {
. . .
}
使用此SomeAction
类:
public class SomeAction implements Action<String> {
. . .
}
它会返回true还是false?如果我做SomeAction instanceof Action<Integer>
答案 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");
}