C#的泛型和java的伪泛型,talk is cheap,show me the code

   C#泛型

下面结果,C#里面会输出false,如果这个还不能真正的说明C#的泛型是真的泛型,那就看下面这段代码。

            List<Test> arr1 = new List<Test>();
List<String> arr2 = new List<String>();
Console.WriteLine(arr1.GetType());
Console.WriteLine(arr2.GetType());
Console.WriteLine(arr1.GetType()==arr2.GetType());

  

  下面这段代码,我们通过反射执行Add方法,即使代码编译通过,但是执行的时候会报错。

        List<String> strList = new List<string>();
        strList.Add("test");

        Type type = strList.GetType();

            type.GetMethod("Add").Invoke(strList, new object[] { 123
});
foreach (var t in strList)
{
Console.WriteLine(t);
}

  

  上面这两段代码证明了,C#的泛型是真的泛型,因为它确实在IL方法中,给了我们一个真实存在的类。

  Java泛型

  java泛型会进行类型擦除,是伪泛型。因为在java生成的字节码中,最后泛型会背Object替代。

java中,下面这些代码都不会报错,足以证明,伪泛型。

        System.out.println("java中的假泛型");
ArrayList<Integer> arr1=new ArrayList<>();
ArrayList<String> arr2=new ArrayList<>();
System.out.println(arr1.getClass()==arr2.getClass()); System.out.println("类型擦除");
ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); //这样调用 add 方法只能存储整形,因为泛型类型的实例为 Integer list.getClass().getMethod("add", Object.class).invoke(list, "asd"); for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}

  C#的泛型是不是真的那么好

    可能有同学会问,C#如果给每个泛型都搞上一个类(在中间代码中),那DLL/EXE会不会变得非常大,从而影响性能呢,是的,我们想到了的,CLR的设计者也想到了。

1、如果为特定类型的实参调用了一个方法,以后相同类型的实参调用这个方法,CLR只会为这个方法进行组合编译一次。比如一个程序集使用了List<DateTime> ,一个完全不同的程序集(加载到同一个AppDomain中)也是用List<Datetime>,CLR只为会为List<DateTime>编译一次。

2、CLR还认为所有引用类型的实参都完全相同,所以代码可以共享,因为引用类型都是在堆上了,因为堆上的东西,都是以对象指针的形式操纵。如果是值类型的呢,就需要专门为每个值类型生成本机代码,因为值类型是位于内存栈上的,值类型的大小不固定,即使大小一样,也没办法共享代码,因为可能要用到不同的CPU的指令来进行操作 

C#的泛型和Java的伪泛型的更多相关文章

  1. C#当中的泛型和java中的对比

    1.C#中的泛型 先写一个Demo: namespace generic {         public class Program         {                 static ...

  2. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  3. java 泛型和object比较

    引言 我们使用object和泛型做形参,都是为了让这个方法能接收更多类型的对象,让程序变得更健壮,代码复用率更高.当我们回看自己写的代码时会发现,好像使用泛型的地方使用object也可以,使用obje ...

  4. java泛型总结(类型擦除、伪泛型、陷阱)

    JDK1.5开始实现了对泛型的支持,但是java对泛型支持的底层实现采用的是类型擦除的方式,这是一种伪泛型.这种实现方式虽然可用但有其缺陷. <Thinking in Java>的作者 B ...

  5. 重读《深入理解Java虚拟机》六、Java泛型 VS C#泛型 (伪泛型 VS 真泛型)

    一.泛型的本质 泛型是参数化类型的应用,操作的数据类型不限定于特定类型,可以根据实际需要设置不同的数据类型,以实现代码复用. 二.Java泛型 Java 泛型是Java1.5新增的特性,JVM并不支持 ...

  6. java中的泛型和sql中的索引

    sql中的索引 索引:好处查询的速度快,被删除,修改,不会对表产生影响,作用是加速查询: 一种典型的数据库对象 作用:提交数据的查询效率,尤其对一些数据量很大的表 索引是用来为表服务的 索引是orac ...

  7. java中的伪泛型---泛型擦除(不需要手工强转类型,却可以调用强转类型的方法)

    Java集合如Map.Set.List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int.long.float.double等基础类型的数据. 使用反射可以破解泛型T类型 ...

  8. [ Java面试题 ]泛型篇

    1.Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 好处: 1.类型安全,提供编译期间的类 ...

  9. Java 中的泛型详解-Java编程思想

    Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的 ...

随机推荐

  1. Linux深入探索01-stty与键盘信号

    ----- 最近更新[2021-12-20]----- 一.简介 最初的 Unix 设定假定人们使用终端连接主机计算机.30多年过去后,情况依然如此,即便是在自己的PC机上运行Unix.多年以来,终端 ...

  2. IDEA出现Cannot resolve symbol “xxx“(无法解析符号)的解决办法

    1,File->Invalidate Caches/Restart 清除缓存并重启 idea 2,检查pom文件中的依赖关系是否正确 3,maven -> Reimport 4,打开pro ...

  3. 『无为则无心』Python函数 — 40、Python自定义异常

    目录 1.使用 raise 语句来抛出异常 (1)抛出异常类 (2)抛出异常类的实例 2.自定义异常类 (1)简单实现 (2)完整实现 在Python中,抛出自定义异常的语法为 raise 异常类对象 ...

  4. 前缀函数与Z函数介绍

    字符串算法果然玄学=_= 参考资料: OI Wiki:前缀函数与KMP算法 OI Wiki:Z函数(扩展KMP) 0. 约定 字符串的下标从 \(0\) 开始.\(|s|\) 表示字符串 \(s\) ...

  5. Django之ajax(jquery)封装(包含 将 csrftoken 写入请求头方法)

    由于支持问题,未使用 es6 语法 _ajax.js /** * 发起请求 * @param url 请求地址 * @param data 请求数据 { } json格式 * @param type ...

  6. PyCharm专业版破解教程

    破解步骤: 1. 下载激活包和注册码:https://pan.baidu.com/s/1_1nrQdTElf4aEg8vGnMTzg 2. 将下载的破解包放入PyCham安装目录的bin文件夹中 3. ...

  7. Java流程控制01:用户交互Scanner

    Scanner对象 之前我们学习的基本语法并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.java.Scanner 是java5 的新特征,我们可以通过Sca ...

  8. 后缀自动机 (SAM)

    后缀自动机 定义 定义 SAM 为一个有限状态自动机,接受且仅接受 \(S\) 的一个后缀. 同时,SAM 是这样的自动机中最小的那个,其中状态数至多为 \(2n - 1\),转移数至多为 \(3n ...

  9. Spring service本类中方法互相调用事物失效问题

    简介 Spring事物利用的是AOP,动态代理采用CGLIB代理(默认,也可以用Proxy代理,但是Proxy代理效率低于CGLIB代理).故只要弄懂Spring的AOP实现,就知道为什么servic ...

  10. winSCP上传文件到服务器失败,提示permission denied,返回码3

    1.查看sftp服务在你服务器的路径 cat /etc/ssh/sshd_config | grep sftp 2.在winSCP进行连接设置 设置好你的主机名.端口.用户名和密码,然后点击高级,点击 ...