1

我的接口有一个泛型类型参数。任何实现该接口的类都必须声明这种类型,这样以后的用户就会知道他们得到了什么。现在,我需要对这些类使用 instanceof 进行检查,以查看它们是否是 Action 的实例。

我的问题是:如果我这样做了,instanceof 会返回什么:

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

}

与这个SomeAction类:

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

}

它会返回真还是假?如果我这样做了怎么办SomeAction instanceof Action<Integer>

4

2 回答 2

3

当您使用instanceof. 引用Javadocs

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

因此,您可以针对Action<?>or进行测试Action,但是如果您尝试针对Action<Integer>. 错误消息非常有用:

无法对参数化类型 Action<Integer> 执行 instanceof 检查。请改用 Action<?> 形式,因为更多的泛型类型信息将在运行时被删除

于 2013-05-25T17:01:26.070 回答
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");
}
于 2013-05-25T17:16:08.290 回答