【问题标题】:Interface generics and instanceof接口泛型和instanceof
【发布时间】:2013-05-25 16:56:54
【问题描述】:

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

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

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

}

使用这个SomeAction 类:

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

}

它会返回真还是假?如果我这样做了SomeAction instanceof Action&lt;Integer&gt;

【问题讨论】:

    标签: java generics interface instanceof


    【解决方案1】:

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

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

    因此,您可以针对Action&lt;?&gt;Action 进行测试,但是如果您尝试针对Action&lt;Integer&gt; 进行测试,则会出现编译器错误。错误信息非常丰富:

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

    【讨论】:

    • 好的,很清楚。留下 > 真的更好,还是没有区别?
    • @Creator13:据我了解,这根本没有区别,但由于错误消息更喜欢&lt;?&gt; 语法,我会坚持下去。
    【解决方案2】:

    我实现了它,它返回 true。

    此外,如果您将泛型全部省略,如下所示:

    if (SomeAction instanceof Action) {
        . . .
    
    }
    

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

    实例的非法泛型类型

    例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多