热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

泛型在使用instanceOf检查的内部类中表现得很奇怪

如何解决《泛型在使用instanceOf检查的内部类中表现得很奇怪》经验,为你挑选了1个好方法。

看代码

public class AdnanTestClass {

    public void doForTest(Object o){
        if (o instanceof TestInnerClass){

        }
    }

    private class TestInnerClass{

    }
}

这段代码在doForTest方法中给出了编译时错误.它说非法的仿制药类型.

如果我用这样的外类限定内部类

    if (o instanceof AdnanTestClass.TestInnerClass){

    }

这个编译完全没问题.

if (o instanceof TestInnerClass)如果我从我的班级声明中删除也会有效.

我不确定我在这里失踪了什么.是否存在符合外部资格的潜在问题.有人可以指出吗?我用intellij idea 14和Java 8做了这个测试.



1> Rohit Jain..:

来自JLS§15.20.2:

如果在instanceof运算符之后提到的ReferenceType不表示可重新生成的引用类型(第4.7节),则为编译时错误.

现在,您的第一个代码:

if (o instanceof TestInnerClass)

相当于:

if (o instanceof AdnanTestClass.TestInnerClass)

但是,由于AdnanTestClass不可再生(参见JLS§4.7), AdnanTestClass.TestInnerClass也不可再生,因此这不是一个有效的表达.该JLS部分的相关引用:

例如,如果泛型类X具有泛型成员类 Y,则该类型X.Y是可重新生成的,因为它X是可重新生成的并且Y是可恢复的.该类型X.Y不可再生,因为Y不可再生.

相反,如果您将其更改为:

// unbounded wildcard
if (o instanceof AdnanTestClass.TestInnerClass)

// or, raw type
if (o instanceof AdnanTestClass.TestInnerClass)

这将是可以回收的,因此是有效的表达.


推荐阅读
author-avatar
流云清动_438
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有