• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#的泛型和Java的伪泛型

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

   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的指令来进行操作 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#类的继承,构造函数实现及其调用顺序发布时间:2022-07-14
下一篇:
C#计时器改进发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap