导航:首页 > 编程语言 > java泛型和c膜拜

java泛型和c膜拜

发布时间:2025-08-25 16:43:36

1. java中的泛型和C++中的模板是不是一样啊,哪位大侠知道,请举例说明下,多谢。

很不一样,随便列举一些

c++的模板,就如同模板这个词字面上的意思一样,属于字符的替代过程
比如有一个模板函数
template <typename T>
void foo(T t) {
t.bar();
}
那么这个可以编译。不过你使用这个函数的时候,T必须是包含bar函数的类

java 则不行
static <T> void foo(T t) {
t.bar();
}
这个是通不过编译的,因为编译器只知道T是一种Object,不知道T的具体类型。
你甚至不能写T t = new T(); 因为在这个方法定义的时候,编译器也不能保证T是有构造函数的

因为c++的模板做事方式是字符串的替代,所以模板参数是int等基本类型是完全没有问题的。
java则不允许int等基本类型作为泛型参数。比如ArrayList<int>是不可以的

java 有covariance 和 contravariance
也就是也可以写一个泛型方法,限定泛型参数是某一个具体的类的子类,比如
static <T> void foo(List<T extends Object> list)
这将能够接受List<String>作为参数,如果只写List<Object>,那是不能将List<String>作为参数传给他的
c++没有这种机制

2. c#泛型和java泛型的区别

泛型技术在C#和Java之中的使用方式看似相同,但实现上却有着根本性的分歧,内C#里面泛型无论在程序容源码中、编译后的IL中(Intermediate Language,中间语言,这时候泛型是一个占位符)或是运行期的CLR中都是切实存在的,List<int>与List<String>就是两个不同的类型,它们在系统运行期生成,有自己的虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现的泛型被称为真实泛型。
Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原始类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList<int>与ArrayList<String>就是同一个类。所以说泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。

3. java中什么叫泛型

泛就是广泛,泛指,型是数据类型. 在java中为了方便多种数据通用一个结构而引入了这个概念.
比如 class A<E> {}, 那么E就是一个泛型,它可以替换为任意类型.
class A<E> { E obj; }
在使用时, A<String>相当于定义了class A {String obj;}. A<Integer>相当于定义了class A{Integer obj;}
使用比如A<String> astr = new A<String>(); 那么astr.obj就是一个String

4. JAVA中的泛型用法一种: <T> 返回值用法。

泛型方法:泛型方法的存在与所在的类是否为泛型无关。要定义泛型方法,只需将泛型参数列表置于返回值前,如:public class ExampleA { public void f(T x) { System.out.println(x.getClass().getName()); } public static void main(String[] args) { ExampleA ea = new ExampleA(); ea.f(" "); ea.f(10); ea.f('a'); ea.f(ea); } },输出结果为:java.lang.String java.lang.Integer java.lang.Character java.lang.Class。

使用泛型方法时,不必指明参数类型,编译器会自动推断出具体的类型。泛型方法除了定义上的差异外,在调用上与普通方法无异。

值得注意的是,一个静态方法无法访问泛型类的类型参数。因此,若要静态方法能够使用泛型能力,必须将其定义为泛型方法。例如:public static <T> void printType(T obj) { System.out.println(obj.getClass().getName()); } public static void main(String[] args) { printType(" "); printType(10); printType('a'); printType(new ExampleA()); },输出结果为:java.lang.String java.lang.Integer java.lang.Character java.lang.Class。

通过这种方式,静态方法可以使用泛型,增强其灵活性和类型安全性。泛型方法的使用大大简化了代码,减少了类型转换的需要,提高了代码的可读性和可维护性。

在Java中,泛型方法的定义和调用遵循一定的规则。定义泛型方法时,需要在方法签名中明确指定泛型参数。这些参数可以在方法内部使用,以实现类型安全。泛型方法的调用则更加灵活,编译器会根据实际传递的参数类型推断出具体的类型。

例如:public static <T> T safeGet(Map<String, T> map, String key) { return map.get(key); },这段代码定义了一个泛型方法safeGet,它接受一个键值对映射和一个键,返回与键关联的值。这种方法可以用于任何泛型类型,提高了代码的通用性。

此外,泛型方法还支持泛型参数的上下文使用,这使得方法可以更灵活地处理不同类型的数据。例如:public static <T extends Comparable<T>> int compare(T a, T b) { return a.compareTo(b); },这段代码定义了一个比较方法,可以用于任何实现了Comparable接口的类型,提供了类型安全的比较操作。

总之,泛型方法的使用使得Java程序更加灵活、安全和易于维护。通过正确地定义和使用泛型方法,开发者可以显著提高代码的质量和可读性。

阅读全文

与java泛型和c膜拜相关的资料

热点内容
电脑端微信查看源代码 浏览:795
ibatis配置文件详解 浏览:658
网络专用配置文件 浏览:837
科技论文word下载 浏览:570
vuejs20路由 浏览:853
vs导出项目源代码 浏览:826
ca证书投标生成文件怎么找不到 浏览:398
车机无网络怎么下载 浏览:891
测试linux配置文件可用 浏览:353
js158航班 浏览:129
医疗行业怎么做网站 浏览:135
java引用数组 浏览:467
c打开文件相对路径 浏览:542
编程里面ST1是什么意思 浏览:311
win10打不开txt文件 浏览:650
如何在手机上练习游戏编程代码 浏览:112
还原系统文件路径 浏览:52
网络猫怎么连接路由器怎么设置无线路由器 浏览:165
苹果5s移动能升级网络设置 浏览:99
一闪app自拍 浏览:56

友情链接