RSS订阅我们这里有经典段子,搞笑段子,经典语录,冷笑话,搞笑笑话,心情短语,暖心的句子,专门给你看各种段子的网站!
你的位置:首页 » 冷笑话 » 正文

百万英雄请听题:能不能初始化泛型参数和数组?看完你便知道

选择字号: 超大 标准 dzgoadmin 发布于2018-03-27 属于 冷笑话 栏目  0个评论 141人浏览

  泛型类型在编译期被擦除,我们在类初始化时将无法获得泛型的具体参数,比如这样的代码:

  这段代码有神么问题呢?t、tArray、list都是类变量,都是通过new声明了一个类型,看起来非常相似啊!但这段代码是编译不过的,因为编译器在编译时需要获得T类型,但泛型在编译期类型已经被擦除了,所有new T()和 new T[5]都会报错(有人可能会有疑问,泛型类型可以擦除为顶级Object,那T类型擦除成Object不就可以编译了吗?这样也不行,泛型只是Java语言的一部分,Java语言毕竟是一个强类型、编译型的安全语言,要确保运行期的稳定性和安全性就必须要求在编译器上严格检查)。可为什么new ArrayList()却不会报错呢?

  这是因为ArrayList表面是泛型,其实已经在编译期转为Object了,我们来看一下ArrayList的源代码就清楚了,代码如下:

  注意看elementData的定义,它容纳了ArrayList的所有元素,其类型是Object数组,因为Object是所有类的父类,数组又允许协变(Covariant),因此elementData数组可以容纳所有的实例对象。元素加入时向上转型为Object类型(E类型转换为Object),取出时向下转型为E类型,如此处理而已。

  此时,运行就没有什么问题了,剩下的问题就是怎么在运行期获得T的类型,也就是tType参数,一般情况下泛型类型是无法获取的,不过,在客户端调用时多传输一个T类型的class就会解决问题。

  类的成员变量是在类初始化前初始化的,所以要求在初始化前它必须具有明确的类型,否则就只能声明,不能初始化。

标签:有神么,

请输入你的在线分享代码
额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

段子狗,我们不生产笑话我们只是笑话的搬运工
站长推荐的文章
最新评论