Java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。

使用反射可以破解泛型T类型,如下:

ArrayList<Integer> array=new ArrayList<Integer>();
array.add();//这样调用add方法只能存储整形,因为泛型类型的实例为Integer
array.getClass().getMethod("add", Object.class).invoke(array, "asd"); //通过反射可以加入字符串类型
反射的使用:根据类名、方法名以及方法对应的参数,获取方法,并实现方法的调用。
调用getMethods方法输出的是自身的public方法和父类父接口的public方法。
调用getDeclaredMethods方法输出的是自身的public、protected、private、default方法。

泛型擦除概念:

声明时的泛型擦除处理机制:

编译成.class文件时,会将.java文件中泛型做一些特殊处理:将类的泛型T去掉,将类中方法中的泛型T(方法参数和返回值T)变成Object,看下边例子,你就秒懂

//类中方法上的泛型
public T set(int index, T element) {
public set(ILjava/lang/Object;)Ljava/lang/Object;
//类上的泛型
public class FXClass<T> implements List<T> {
public class com/example/zs/fanxing/FXClass implements java/util/List {

引用时的泛型擦除处理机制:

        FXClass<Integer> list1 = new FXClass<Integer>();
list1.add(new Integer());
list1.add(new Integer());
Integer a =list1.get();//这行对应的字节码指令如下:
INVOKEVIRTUAL com/example/zs/fanxing/FXClass.get (I)Ljava/lang/Object;
CHECKCAST java/lang/Integer//这句指令的出现是因为源代码中使用了 (Integer a =) 划重点,个人理解:

 1)get(0)获得的是Object类型,但是编译器看到我们把Object类型赋值给了整形a,所以会生成一条指令CHECKCAST,

运行时会检查Object能不能转成Integer类型,并且这条指令会抛异常呦。

 2)get(0)并没有手动强转Integer,但编译器却可以调用Integer的方法。

												

java中的伪泛型---泛型擦除(不需要手工强转类型,却可以调用强转类型的方法)的更多相关文章

  1. Java 中为什么不能创建泛型数组?

    之前只是知道在 Java 中不能创建泛型数组,今天翻看 <Effective Java>其中对这个部分有讲解,记录一下. 现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情 ...

  2. Java 中的伪共享详解及解决方案

    1. 什么是伪共享 CPU 缓存系统中是以缓存行(cache line)为单位存储的.目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes.在多线程情况下,如果需要修改 ...

  3. java中集合里的泛型

    import java.util.ArrayList;/* * 泛型 : java jdk1.5新特性. * 泛型的好处 : * 1.将运行时的错诶提前到编译时. * 2.避免无谓的强制类型转换. * ...

  4. Java 中 给静态方法 添加泛型 (static <T>)

    今天在用到static方法的时候.想要用泛型.结果不能通过编译. 上网查了一下.其具体写法如下:

  5. java中JSON转含泛型对象

    public static void main(String[] args) { UserDto userDto=new UserDto("test","14" ...

  6. 关于java中的伪共享的认识和解决

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素: CPU缓存 网页浏览器为了加快速度,会在本机存缓存以前浏览过 ...

  7. java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

    /* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Par ...

  8. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  9. 说说Java中的枚举(一)

    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...

随机推荐

  1. 安装scrapy出错Failed building wheel for Twisted

    用64位windows10的CMD命令安装pip install scrapy出错: Running setup.py bdist_wheel for Twisted ... error Failed ...

  2. itchat库初探--微信好友全头像的拼接

        代码: import itchat import math import PIL.Image as Image import os itchat.auto_login() friends = ...

  3. markdown中如何插入公式

    转自 :https://www.tuicool.com/articles/qqIrUbN 我是如何在Markdown文档里插入公式的 时间 2016-08-07 21:05:33 异步社区 原文  h ...

  4. string_array.go

    package app import (     "strings" ) type StringArray []string func (a *StringArray) Set(s ...

  5. 「CodeChef Dec13 REALSET」 Petya and Sequence 循环卷积

    题目大意: 传送门 T组询问. 每组给一个数组,询问该数组是否循环移位线性无关,输出YES或NO. 题解: LCA冬令营有讲……然而当时…… 并不知道如何计算一个数组是否循环移位线性无关……网上也没有 ...

  6. java接口变量问题

    java中接口是不能实例化的,然而像下面这种用法是可以的: List<FileItem> items = upload.parseRequest(request); Iterator< ...

  7. eclipse使用Git基本流程

    1.安装GIT 2.Git的使用 ①下载代码到eclipse(右键导入工程) ②提交代码到本地(commit) ③更新代码到本地(pull) ④当本地出现冲突时,解决冲突,没有冲突当然就最好啦 ⑤提交 ...

  8. 影响HTTP性能的常见因素

    影响HTTP性能的常见因素 我们这里讨论HTTP性能是建立在一个最简单模型之上就是单台服务器的HTTP性能,当然对于大规模负载均衡集群也适用毕竟这种集群也是由多个HTTTP服务器的个体所组成.另外我们 ...

  9. Bootstrap优秀模板-Unify.2.6.2

    这是一个非常老牌的Bootstrap商业模板,全面性和稳定性俱佳,有LandingPage.BussinessPage.AdminPage多种模式,非常推荐用来构建官网.响应式应用Web.管理端Web ...

  10. 分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark

    今天早上六点半左右微信群里就看到张队发的关于.NET Spark大数据的链接https://devblogs.microsoft.com/dotnet/introducing-net-for-apac ...