JAVA C# C/C++比教学:泛型

C++和C#之泛型编程对比 摘要泛型编程的思想由来已久,由STL之父-Alex Stepanov提出。Ada、C++、以及最近的Java和C#都相继加入了对泛型编程的支持。其中已纳入C++标准的STL ,就是泛型编程的一个成功的应用。由于每种语言的特性不同,因此在泛型的实现上大有差别,那么这些编程语言在泛型的实现机制和编程应用方面到底有什么区别呢?本文试图从这两个方面来探讨C++和C#在泛型编程支持方面的区别。关键词 阅读详情

所谓泛型,便是指参数化类型
1、JAVA
java中允许使用泛型定义接口,类和方法。如

    //泛型方法
    public <T1, T2> void printPoint(T1 x, T2 y){
        T1 m = x;
        T2 n = y;
        System.out.println("This point is:" + m + ", " + n);
    }
    //泛型类
    class Point<T1, T2>{

    }

java的泛型机制是伪泛型。意味着在编译期间,所有的泛型信息都会被擦掉。即所谓的类型擦除。
类型擦除只通过类型参数合并,将泛型类型的实例关系到同一个字节码上。
如

interface Comparable <A> {
  public int compareTo( A that);
} 

中,A被直接替换为了object
由于隐蔽类型擦除的问题,出现了很多灵异结果。
java中泛型必须是类,不能是基本类型。

2、C#
当编译器遇到泛型的定义时,会将泛型转化为独特的IL代码,如

public CompareUtil(T itemOne, T itemTwo)会被转化为:

GenericTest.CompareUtil`1<([mscorlib]System.IComparable) T>
    `1表示元数,也就是类型参数的数量
    <([mscorlib]System.IComparable) T>就是我们加在泛型类型上的类型约束
!T和!0
    !T就是类型参数的占位符
    !0代表第一个类型参数(当泛型的元数为2时,!1就代表第二个类型参数)

当程序调用该方法时,会根据类型实参将IL由JIT转化为本机代码。本地代码中只涉及实际的参数类型。

3、C/C++
C++在编译时,做法是根据函数的调用代码,分别生成几个传入参数不同的函数。这显然会带来代码膨胀的问题。

//泛型函数的写法
template <typename T>
int compare(const T &v1, const T &v2) {
        if(v1 < v2) return -1;
        if(v2 < v1) return 1;
        return 0;
}
//泛型函数的实际调用
int a = 1, b = 0;
cout << compare(a, b) << endl;

double x = 2.1, y = 3.3;
cout << compare(x, y) << endl;

string s1 = "hi", s2 = "world";
cout << compare(s1, s2) << endl;
//泛型函数在编译中会被等效为
int compare(const int &v1, const int &v2) {
        if(v1 < v2) return -1;
        if(v2 < v1) return 1;
        return 0;
}

int compare(const double &v1, const double &v2) {
        if(v1 < v2) return -1;
        if(v2 < v1) return 1;
        return 0;
}

int compare(const string &v1, const string &v2) {
        if(v1 < v2) return -1;
        if(v2 < v1) return 1;
        return 0;
}
C++/Java/C#泛型与模板机制深度对比:从实现原理到实战应用 泛型编程是现代编程语言中实现代码复用和类型安全的核心技术,其本质在于编写独立于具体类型的通用算法和数据结构。从实现原理上看,主要分为编译时展开和运行时支持两种范式:C++模板采用编译时代码生成,在实例化时为每个类型参数生成特化版本,实现零开销抽象;Java泛型基于类型擦除,在编译期进行类型检查后擦除类型信息,通过插入强制转换保证安全,确保了二进制兼容性;C#泛型则在运行时层面实现完整支持,为值类型生成特化代码、为引用类型共享代码,兼具性能与灵活性。在技术价值上,泛型显著提升了代码的可维护性和类型安全性,避免 阅读详情

相关推荐

process插件_利用SPSS 插件MLmed检验多水平中介的调节模型

本文介绍一个SPSS插件,用于检验多水平中介的调节,及该方法与Mplus的比较。1 Mlmed 简介及安装Mlmed 简介: Mlmed 由Rockwood 2017年开发,基于SPSS插件计算Multilevel moderated mediation. 可以提供multilevel mediation Monte Carlo 置信区间比如(模拟20000次),以及多水平调节的...

weixin_39976081的博客 5768

C#、Java以及C++的泛型

Copyright © 1996-2005 Artima Software, Inc. All rights reservedGenerics in C#, Java, and C++A Conversation with Anders Hejlsberg, Part VIIby Bill Venners with Bruce Eckel. January 26, 2004翻译:h

6335

Data+AI新玩法:Text2SQL让数据查询变得如此简单!

你是不是也遇到过这种情况?明明手头有海量数据,却因为SQL这道“门槛”,让分析和决策变得复杂和拖沓。你可能想着:“要是我能直接用自然语言和数据库对话,那该多好!你不是一个人在这样想,Text2SQL技术正是为了帮你摆脱这一困境而诞生的。

Ase5gqe的博客 865

C++、C#、JAVA中模板与泛型

对于C++,泛型也叫做模板。 声明与定义泛型类: public template class TestClass{}; 声明与定义泛型方法: public template void TestFunc(T t1, T t2){} 成员函数的模板声明与普通函数的模板声明一样只不过在定义的时候有点区别,如果是在类里面定义成员函数那就跟普通函数一样,但是如果是在类外面定义,那就有区别了,具体如下:

g272165123的专栏 1237

Scrapy实现微博关键词爬虫(爬虫结果写入mongodb)

话不多说,上代码: spiders文件夹下的microBlogSpider.py里这样写: # -*- coding: utf-8 -*- import scrapy from scrapy import Spider, Request, FormRequest from scrapy.selector import Selector import datetime import random from blogSpider.items import microBlogItem, keyWordItem f

qq_39360565的博客 1779

医疗设备安规入门:一张图搞懂BF型设备的MOOP/MOPP绝缘路径(附GB 9706.1附录解析)

本文深入解析了BF型医疗设备的MOOP/MOPP绝缘路径设计,结合GB 9706.1标准附录J的实战应用,帮助工程师快速掌握医疗设备安规要点。通过典型绝缘路径图分析,详细对比了MOOP与MOPP的防护差异,并提供了海拔修正、漏电流测试等关键设计指南,助力医疗设备安全合规。

weixin_30633405的博客 383

C#中的泛型,与java。C++中泛型的区别

原著 :Bill Venners、Bruce Eckel  2004.2.26 原文 :http://www.artima.com/intv/generics.html  翻译 :lover_P [人物介绍]     Anders Hejlsberg , 微软著名工程师,带领他的小组设计了C#(读作:C-Sharp)程序设计语言。Hejlsberg第一次登上软件界历史舞台是在80年

nabila的专栏 3301

相机标定原理与张氏标定法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

heeweii的博客 2280

Unity通过NDK、JNI实现C#、java、C/C++之间的相互调用

一、关于NDK NDK,全称Native Development Kit,是Android的一种开发工具包。 目前的Android开发,不再是纯粹的Java层开发,更多的会与C/C++结合,把一些重要的方和行为以及一些私密性质的东西放在C/C++中,通过NDK将其编译成.so动态库文件,放入工程中的libs目录。 二、Unity在Android平台通过C#调用.so库接口 如果是Java调用C/C++写的.so动态库的接口,需要用到JNI,如果是Unity中使用C#调用C/C++写的.so动态库的接口,则通

linxinfa的专栏 9667

Python爬取上市公司年报并进行财务比率分析:基于异步爬虫与数据挖掘的实战

在当今数据驱动的投资时代,获取并分析上市公司财务数据对于投资者、分析师和研究人员至关重要。中国证监会指定的上市公司信息披露网站——巨潮资讯网,包含了所有A股上市公司的年报、季报及其他公告信息。本项目将展示如何使用Python最新技术栈爬取巨潮网的年报数据,提取关键财务指标,并进行深入的财务比率分析。本文将采用异步爬虫技术提高数据采集效率,使用现代解析库处理PDF和HTML文档,并结合pandas进行数据分析和可视化。整个过程将遵循合规合法的爬虫伦理,尊重网站robots.txt协议,设置合理的请求间隔。

2201_76125261的博客 666

MATLAB算法实战应用案例精讲-【数模应用】校准曲线(附MATLAB、python和R语言代码实现)

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我们理解模型的预测概率是否与实际标签的分布一致。校准曲线通常包括以下步骤:计算模型预测概率:对于测试集中的每个样本,模型会输出一个概率值,表示样本属于正类的概率。将数据分桶:将这些概率值分成若干个等宽的桶(例如10个桶),每个桶中的样本具有相似的预测概率。

qq_36130719的博客 557

c++和c#和c语言

C 语言是过程式编程语言,提供低级别内存管理和高性能。C++是 C 语言的扩展,支持面向对象和泛型编程,保持高性能。C#是受 C 和 C++ 语法影响的面向对象语言,设计用于 .NET 平台,具有自动内存管理和丰富的标准库。尽管 C++ 和 C# 都受到了 C 语言的影响,但它们的发展方向和应用领域有很大的不同。

Random_N1的博客 4498

27、单阶段目标检测算法(SSD):原理、训练与实战

本文详细介绍了单阶段目标检测算法SSD的原理、训练方法与实战应用。内容涵盖SSD的核心机制,如特征图离散化、边界框预测、损失函数设计及难负样本挖掘,并通过使用dlib车辆数据集从零开始训练SSD模型的完整流程展示了实际操作步骤。文章还讨论了训练中的关键问题,如边界框坐标处理和‘忽略区域’缺失的影响,提供了模型评估与优化策略,包括超参数调整、基础网络替换和数据增强。最后总结了SSD的优势与局限性,并展望了未来目标检测技术的发展方向。

nice1的博客 505

一文搞懂泛型编程

针对int、double等基本数据类型,虚拟机会为每一种类型生成具体的算法程序实例,也就是说针对使用了基本数据类型的泛型代码,用了多少种基本数据类型,就会有多少种实例,这样处理更高效,因为值类型不需要装箱和拆箱。Go中的泛型实例是在编译时展开的,类似C#的泛型实例化结果,对于每个不同的值类型,编译器会生成一个独立的泛型实例,对于引用类型的泛型实例,只需要生成一次,然后在需要时进行复制或传递引用,这样可以节省内存并避免重复的实例化开销。这让代码更加可读、灵活,并增加了类型安全性,减少了运行时的类型错误。

程序员,AI探索者 1293

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

泛型编程基础探究

到目前为止,C++是我发现的最适合表达我想法的语言。泛型编程(Generic Programming)的核心思想是通过对具体、高效的算法进行抽象,推导出泛型算法,并将其与不同的数据表示结合,生成有用的软件。因为C#和Java等现代语言的设计使得所有内容都继承自“Object”,因此创建的所有内容都被视为对象,这导致对象的边界变得模糊,理论上的OOP与实际实现之间存在明显差距。有趣的是,C++最初是为了在C中引入面向对象编程(OOP)而设计的,这使得在C++中实现与OOP相异的哲学显得有些黑色幽默。

2404_84768005的博客 1219

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

[转]Anders Hejlsberg谈C#、Java和C++中的泛型

[翻译] lover_P 2004-03-25 原著:Bill Venners、Bruce Eckel2004.2.26原文:http://www.artima.com/intv/generics.html翻译:lover_P[人物介绍]Anders Hejlsberg,微软著名工程师,带领他的小组设计了C#(读作:C-Sharp)程序设计语言。Hejlsberg第一次登上软...

dd_dd1234的博客 182

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[ZT]Anders Hejlsberg谈C#、Java和C++中的泛型

[翻译] lover_P 2004-03-25 原著:Bill Venners、Bruce Eckel2004.2.26原文:http://www.artima.com/intv/generics.html翻译:lover_P[人物介绍]Anders Hejlsberg,微软著名工程师,带领他的小组设计了C#(读作:C-Sharp)程序设计语言。Hejlsberg第一次登上软...

172

深入解析Java泛型、C#泛型与C++模板:设计哲学、实现机制与实战对比

泛型(Generics)和模板(Templates)是现代编程语言中实现代码复用与类型安全的核心机制。其核心原理在于通过参数化类型,允许开发者编写可操作多种数据类型的通用代码,而编译器或运行时负责进行类型检查与特化,从而在提升代码复用率的同时保障类型安全。这一技术为构建健壮、可维护的大型软件系统提供了关键支撑,其价值体现在减少代码重复、提升开发效率以及增强编译时错误检测能力上。在实际工程中,泛型与模板广泛应用于集合框架、算法库、数据容器及各类需要高度抽象的组件开发场景。本文聚焦于Java泛型、C#泛型与C+

weixin_30457465的博客 404

(轉貼) Anders Hejlsberg談C#、Java和C++中的泛型 (.NET) (C#)

原著:Bill Venners、Bruce Eckel 2004.2.26 原文:http://www.artima.com/intv/generics.html 翻譯:lover_P [人物介紹] Anders Hejlsberg,微軟著名工程師,帶領他的小組設計了C#(讀作:C-Sharp)程序設計語言。Hejlsberg第一次登上軟件界歷史舞台是在80年代早期,因為他為MS-DOS和...

weixin_33755649的博客 200

c 模板 java泛型_C#和JAVA…中泛型的区别是什么?以及C+中的模板?

我会把我的声音加到噪音里,试着把事情弄清楚:C#Generics允许您声明类似的内容。Listfoo=newList();然后编译器将阻止您将非Person列入名单。C#编译器只是把List在.NET DLL文件中,但是在运行时,JIT编译器会生成一组新的代码,就好像您编写了一个特殊的List类,只用于包含人员-类似于ListOfPerson.这样做的好处是它让它变得非常快。不存在强制转换...

weixin_30013175的博客 113

Java特性 . 泛型

1. 什么是泛型? 泛型现在几乎是所有主流强类型编程语言的标配,它允许我们在编写代码时定义一些可变的部分,从而最大化复用代码,提高软件开发效率。 我们来看看 C++, C#, Java 的泛型特性。 1.1 C++ 泛型 C++泛型是通过模板实现的,模板类和模板函数是非常常用的泛型特性。C++11泛型还引入了新特性模板特化,有兴趣同学可以去了解下。 template<typename T> T add(T t1, T t2) { return t1 + t2; } templ

whose book 的博客 388

Java、C#、C++泛型与模板核心机制对比与实战选型指南

泛型编程是现代软件开发中实现代码复用与类型安全的核心技术。其基本原理是通过参数化类型,允许开发者编写独立于具体数据类型的通用代码,从而提升代码的抽象能力和可维护性。从技术价值看,它能在编译时进行更严格的类型检查,减少运行时错误,并有助于构建高性能、高可复用的组件库。在实际应用场景中,泛型被广泛用于集合框架、算法封装、设计模式(如工厂模式、仓储模式)以及依赖注入框架等。然而,不同语言对泛型的实现机制迥异,这直接影响了其性能表现和适用场景。例如,C++的模板采用编译期代码生成,追求极致性能;Java泛型基于类型

weixin_34409357的博客 341

C语言、C++、C#的区别和联系(新手必看)

C++ 和C语言有着血缘关系。C++ 在C语言的基础上发展而来,增加了很多新特性和新功能,比C语言更加强大,可以认为:C++ 几乎完全包含了C语言,而C语言也可以看做 C++ 的一部分。C++ 源文件的后缀是 .cpp,C语言源文件的后缀是 .c,你在 .cpp 文件中写C语言代码通常也是没问题的。但是请注意,C++ 仍然舍弃或者改变了极少量的C语言特性,所以在实际开发中,我们最好还是要区分 C++ 和C语言的。C# 是一门完全独立的语言,它和C语言、C++ 没有半毛钱关系。

zdoeo的博客 4291


Java泛型

0 前言 本文主要是对参考资料的一些整理,以及一些个人见解,难免会有理解错误的地方,欢迎大家指正。 1 概述 Java语言于1995年发布第一个版本,自1991年Sun(1982-2009,被Oracle收购)成立Green项目进行开发以来,花费近四年时间。Java语言主要脱胎于C++语言(诞生于贝尔实验室并于1983年开始发行),在发展过程中与众多面向对象语言(Object-Oriented ...

weixin_34127717的博客 152

java 泛型与c_C#和Java …中的泛型和C中的模板有什么区别?

我会添加我的声音的噪音,并采取刺刀使事情清楚:C#泛型允许你声明这样的东西。List foo = new List();然后编译器将阻止你把不是Person的东西放到列表中。在后台,C#编译器只是将List进入.NET dll文件,但在运行时JIT编译器会构建一组新的代码,就好像你编写了一个专门用于包含人的列表类 – 像ListOfPerson。这样做的好处是它使它真的很快。没有投射或任何其他的东...

weixin_35595817的博客 148
上一篇: C++和C的不同
下一篇: C#中的代理委托和event关键字
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值