最新要闻
- 左偏树-环球观点
- 世界最新:ChatGPT只讲这25个笑话!有90%重复 网友:幽默是人类最后的尊严
- 环球速讯:火车站按摩椅现大量虫子 商家:每天都有打扫 很少有这种情况
- 焦点滚动:福建多地为何纷纷成立这一机构?
- 聚焦:希捷4TB机械硬盘史低 仅售288元
- 社交综艺为何能成爆款_世界百事通
- 芯片的战争
- 这些年,祝勇的“纸上故宫”都在写些什么?|文化观察 天天讯息
- 吢丕的另一个情侣网名(吢)
- 环球短讯!最后一艘潜艇电影国语版百度云(最后一艘潜艇电影国语版)
- 镁条在空气中燃烧发出耀眼的白光(镁条在空气中燃烧)
- 女朋友不理你怎么办表情包_女朋友不理你怎么办
- 南京两大厦间现龙卷风:强风至路面闪现火花 每日视点
- 当前简讯:14代酷睿要来了 英特尔13代酷睿i9包装简化:独特身份消失
- 预计2025年突破万亿元规模 产学研各方共议储能大赛道
- 徐州城下城遗址博物馆“上新”
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【天天播资讯】【技术积累】Java中的泛型【一】
泛型是什么
Java中的泛型是一种能够让用户在编写代码时避免使用明确的类型而进行类型参数化的机制。Java中的泛型可以让编程者在代码编写时不必关心具体类型,只用关心类型之间的关系和相互转换,从而在编写代码的过程中实现类型的复用。这使得代码更加简洁、可读性更高,并且可以提高代码的可维护性和可扩展性。
(资料图片)
Java泛型可以在类、方法、接口、以及数组等多个地方使用,并且可以结合约束条件来限制类型参数的类型。例如,在定义一个泛型类时,可以使用
Java中的泛型还具有类型检查和类型擦除的特性。类型检查可以检查在编译时期是否使用了正确的类型,避免了在运行时期由于类型转换错误而产生的异常。而类型擦除则是Java泛型在实现时使用的一种技术,它会去掉泛型中的类型参数信息,并将其变为原始类型,在运行时也不会保留泛型的信息,从而实现Java泛型的运行时兼容性。
什么是类型参数?
Java中的类型参数是用于泛型编程的占位符,可以用来表示任何类型。它们用尖括号 "<>" 括起来,放置在类名或方法名后面,用来指定通用类型。例如,以下代码中的 T 就是一个类型参数:public class MyClass { private T value; public void setValue(T value) { this.value = value; } public T getValue() { return value; }}
在上面的代码中,T 代表一个通用类型。可以在创建 MyClass 对象时指定 T 的具体类型,如:MyClass intObj = new MyClass<>();MyClass strObj = new MyClass<>();
这样,intObj 对象中的 value 的类型就是 Integer,strObj 对象中的 value 的类型就是 String。类型参数可以用在类、方法、接口等地方,用来实现通用的算法。使用类型参数可以允许我们编写一次通用的代码,可以用于不同类型的数据,是 Java 泛型编程的核心特性。什么是类型擦除?
类型擦除(type erasure)是指在Java编译期间,对泛型类型参数信息的擦除,将所有泛型类型参数都用它们的上界(或Object类型)替换,从而在运行时不会保留泛型类型信息。具体来说,编译器会将泛型类、泛型接口中的类型参数用对应的类型上限(即extends关键字后面的类型)替换,泛型方法中的类型参数也会被替换。例如,对于以下泛型类:public class Pair { private T first; private S second; public Pair(T first, S second) { this.first = first; this.second = second; } public T getFirst() { return first; } public S getSecond() { return second; }}
它在编译后会被转换为:public class Pair { private Object first; private Object second; public Pair(Object first, Object second) { this.first = first; this.second = second; } public Object getFirst() { return first; } public Object getSecond() { return second; }}
这就是类型擦除的过程,所有泛型类型信息都被擦除并替换为Object类型。虽然泛型类型信息被擦除,但在运行时可以通过反射机制获取到泛型类型信息,这使得泛型在运行时仍然可以使用。但是,由于类型擦除,泛型类型参数在运行时无法进行类型检查,因此可能会导致类型安全问题。什么是通配符类型?
Java中的通配符类型是一种泛型类型,用于表示未知类型的泛型参数。 通配符类型由问号(?)表示,其可以用作方法的参数类型、字段类型、局部变量类型等任何地方需要使用泛型类型的地方。
通配符类型有两种形式:无界通配符类型和有界通配符类型。
无界通配符类型是指使用符号 ? 表示未知类型,例如 List>。在使用无界通配符类型时,不能添加任何元素到集合中,因为这个集合的元素类型是未知的。但是,可以从集合中获取元素,并将其转换为 Object 类型。
有界通配符类型是指使用符号 ? extends 或 ? super,限制泛型参数的类型范围。例如,List extends Number> 表示泛型参数必须是 Number 类型或其子类型。而 List super Integer> 表示泛型参数必须是 Integer 类型或其父类型。在使用有界通配符类型时,可以添加元素到集合中,并能获取它们。
注意,通配符类型不能用于泛型类或泛型接口的定义,只能作为方法参数或返回类型的通用形式使用。
什么是泛型方法和泛型类
泛型方法和泛型类是Java中重要的概念,它们的作用是为了提高代码的可重用性和安全性。
泛型方法是在方法的声明中使用泛型类型,使得方法可以接受不同类型的参数,同时还可以指定返回值或方法体中使用的泛型类型。泛型方法通常有以下特点:
- 泛型方法可以在方法中定义自己的类型参数,也可以使用类定义的类型参数。
- 泛型方法可以接受任意类型的参数,即可以接受参数化类型,也可以接受普通类型。
- 泛型方法可以有多个类型参数,也可以没有类型参数。
- 泛型方法可以有泛型类型的返回值。
下面是一个使用泛型方法的例子:
public static void printArray(T[] array) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } System.out.println();}
在这个例子中,我们定义了一个名为 printArray 的泛型方法,它接受一个泛型数组作为参数,并且使用 for 循环遍历数组的每个元素,最后输出所有元素到控制台。
泛型类是在类的声明中使用泛型类型,使得类可以接受不同类型的参数,同时还可以指定类中使用的泛型类型。泛型类通常有以下特点:
- 泛型类可以在类名后面添加泛型类型参数。
- 泛型类可以在类中定义泛型类型的实例变量。
- 泛型类可以有泛型类型的构造方法。
- 泛型类可以有泛型类型的方法。
下面是一个使用泛型类的例子:
public class Box { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } public void setValue(T value) { this.value = value; } public static void main(String[] args) { Box box = new Box<>(10); System.out.println(box.getValue()); }}
在这个例子中,我们定义了一个名为 Box 的泛型类,它有一个泛型类型参数 T,同时定义了一个名为 value 的实例变量,以及相应的 get 和 set 方法。在 main 方法中,我们创建了一个 Box 对象,并且使用泛型类型为 Integer 的参数,然后输出了这个对象的值到控制台。
总的来说,泛型方法和泛型类是Java中非常重要的概念,它们可以为我们提供更加灵活和安全的编程方式,同时也是提高代码可读性和可维护性的有效手段。
泛型类中是否可以继承泛型类
Java中泛型类可以继承泛型类,这一特性被称为泛型的继承或泛型的子类化。
在泛型类继承中,子类继承的父类可以是泛型类也可以是非泛型类。当子类继承的父类是泛型类时,子类可以继承父类的泛型类型;也可以在继承时指定自己的泛型类型。
下面是一个范例来展示Java中泛型类继承泛型类的用法:
public class Parent { // 泛型类型 T private T data; public void setData(T data) { this.data = data; } public T getData() { return data; }}public class Child extends Parent { // 继承泛型类 Parent}public class Test { public static void main(String[] args) { Child child = new Child(); // 子类指定了泛型类型为 String child.setData("Hello World"); System.out.println(child.getData()); // 输出结果为 "Hello World" }}
在上面的例子中,Child类继承了Parent类,由于Parent类是一个泛型类,所以Child类又继承了Parent类的泛型类型T。而在定义Child类时,也可以在继承Parent类时指定T的具体类型,如Child
总结一下,Java中允许泛型类继承泛型类,子类也可以使用父类的泛型类型或为自己指定泛型类型。这个特性可以帮助开发者更好地管理和组织泛型类,能够提升代码的可重用性和可读性。
泛型方法中是否可以声明泛型类
Java中泛型方法可以声明泛型类,这样可以在方法中使用泛型类型参数,从而在方法中实现通用的操作。
除了声明泛型类,泛型方法还可以声明泛型方法参数、返回类型,以及利用泛型通配符进行类型转换等常用操作。
以下是一个简单的示例,展示了在泛型方法中声明泛型类的用法:
public class MyClass { public void printElements(E[] elements) { for (E element : elements) { System.out.println(element.toString()); } T obj = new T(); // 泛型类类型参数T在泛型方法中使用 }}public class Test { public static void main(String[] args) { Integer[] integers = {1, 2, 3, 4, 5}; String[] strings = {"Hello", "World"}; MyClass myClass = new MyClass<>(); myClass.printElements(integers); MyClass myClass1 = new MyClass<>(); myClass1.printElements(strings); }}
在上述代码中,我们定义了一个泛型类 MyClass
在Test类中,我们实例化了两个 MyClass 类,分别强制指定泛型类型参数为 Integer 类型和 String 类型,并通过执行各自的 printElements 方法来打印数组元素。
通过这种方式,Java中的泛型方法不仅支持泛型类型参数,也支持对泛型类(包括实例化泛型类对象)的操作,从而让我们可以实现更加通用的方法封装,提升代码的可读性和复用性。
为什么类型参数不能是原始类型
- 泛型的类型擦除机制
Java中的泛型是通过类型擦除机制实现的。泛型类和方法会在编译时通过擦除类型信息来去除泛型的影响,转换成原始类型。例如,List
原始类型与泛型类无法一起使用,这样会破坏Java 的类型安全。如果类型参数允许原始类型,那么在擦除类型信息之后,无法在运行时获得类型信息,这就导致了无法编写通用的泛型代码。
- 原始类型的限制
原始类型不能继承任何类,也无法实现任何接口。如果类型参数可以是原始类型,那么泛型类就无法利用Java强大的面向对象特性来实现更加复杂、灵活的结构。
- 自动类型转换问题
Java中自动类型转换和类型擦除机制可能会导致类型参数变为原始类型。例如,我们在泛型方法中将一个原始类型转换为一个泛型类型参数,当运行时擦除类型时,这个泛型类型变成了Object类型,而不是我们想要的类型参数。
综上所述,Java中为什么类型参数不能是原始类型,是因为这种做法会破坏Java的类型安全和面向对象特性,无法实现通用的泛型代码。
什么是限定通配符和无限定通配符?
限定通配符是Java中泛型的一个重要特性,用于指定泛型参数的上界或下界。
在Java中,泛型参数不仅可以指定具体的类型,还可以指定一个范围,即可以定义类型的上界或下界。限定通配符就是用来指定这个范围的符号。
限定通配符分为extends和super两种类型:
- extends限定通配符:用于指定泛型参数的上界。表示类型必须是指定类型或其子类。
示例:List extends Number> 表示泛型参数必须是Number或其子类,如Integer、Double等。
- super限定通配符:用于指定泛型参数的下界。表示类型必须是指定类型或其父类。
示例:List super Integer> 表示泛型参数必须是Integer或其父类,如Number、Object等。
限定通配符的作用是确保泛型参数的类型符合特定的条件,同时增加代码的可用性和可读性。
Java中的无限定通配符(Unbounded Wildcard)是指泛型参数没有任何限制,使用符号"?"来表示。
示例:List> 表示List中可以存放任何类型的对象,相当于是List
无限定通配符可以用于以下情况:
当泛型参数类型并不重要时,比如在方法中只需要对泛型参数进行处理而不需要知道具体类型。
当泛型类型的上界或下界无法确定时,比如在方法中需要接受不同类型的List对象,但是这些List对象的元素类型并不确定。
无限定通配符并不能直接调用参数的方法或者添加新的元素,因为其具体的类型是未知的,需要通过强制类型转换才能进行操作。
什么是类型边界
Java泛型中的类型边界(Type Bound)是指限制泛型类型参数的范围,使得参数只能是特定类或其子类,或者实现了特定接口的类或其实现类。
类型边界有两种形式:extends和super。extends用于限制类型参数的上界(Upper Bound),即指定参数只能是某一类或其子类的类型;super用于限制类型参数的下界(Lower Bound),即指定参数只能是某一类或其父类的类型。
//类型边界为Number及其子类public class GenericClass {private T number;public GenericClass(T number) {this.number = number;}public T getNumber() {return number;}}GenericClass intClass = new GenericClass<>(10);GenericClass doubleClass = new GenericClass<>(3.14);//类型边界为String及其父类public class GenericClass {private T str;public GenericClass(T str) {this.str = str;}public T getString() {return str;}}GenericClass
什么是协变
Java泛型中的协变(Covariant)是指泛型类型参数的子类型关系能够被继承到泛型类的实例化类型中。也就是说,子类型的泛型类实例可以替代父类型的泛型类实例。
在Java中,协变类型只有在泛型参数是用作方法返回值类型时才可以生效。在这种情况下,如果泛型实例可以返回子类型对象,则该类型为协变类型。
public class Animal {}public class Dog extends Animal {}//泛型协变public class GenericClass {public T getAnimal() {return null;}}GenericClass dogClass = new GenericClass<>();GenericClass extends Animal> animalClass = dogClass;Animal animal = animalClass.getAnimal(); //协变成Animal类型Dog dog = dogClass.getAnimal(); //无需转换,返回类型为Dog
什么是类型变量的继承
Java泛型中,类型变量的继承是指当一个泛型类型参数被声明在一个类中,并被另一个类继承时,继承后的子类可以直接使用该泛型类型参数。
具体来说,当一个类声明了泛型类型参数T,在另一个类中继承该类时,可以通过在子类中指定T的具体类型来使用其父类中声明的泛型类型。子类可以继承和使用其父类中的泛型类型,或者在实现接口时使用泛型类型。
public class ParentClass {T t;public T getT() {return t;}}public class ChildClass extends ParentClass {}ChildClass child = new ChildClass<>();child.setT("Hello"); //继承父类中的泛型类型TString s = child.getT(); //继承父类中的泛型类型T//类实现接口时使用泛型类型public interface MyInterface {public T getT();}public class MyClass implements MyInterface {}MyClass myClass = new MyClass<>();String s = myClass.getT(); //使用泛型类型T
关键词:
【天天播资讯】【技术积累】Java中的泛型【一】
天天亮点!HBase的数据结构原理与使用
Xilinx GTH 简介 ,CoaXpress FPGA PHY 部分-天天短讯
左偏树-环球观点
世界最新:ChatGPT只讲这25个笑话!有90%重复 网友:幽默是人类最后的尊严
环球速讯:火车站按摩椅现大量虫子 商家:每天都有打扫 很少有这种情况
焦点滚动:福建多地为何纷纷成立这一机构?
聚焦:希捷4TB机械硬盘史低 仅售288元
社交综艺为何能成爆款_世界百事通
芯片的战争
这些年,祝勇的“纸上故宫”都在写些什么?|文化观察 天天讯息
List 接口及其常用方法 全球即时看
文心一言 VS 讯飞星火 VS chatgpt (38)-- 算法导论5.4 2题 全球新要闻
吢丕的另一个情侣网名(吢)
环球短讯!最后一艘潜艇电影国语版百度云(最后一艘潜艇电影国语版)
镁条在空气中燃烧发出耀眼的白光(镁条在空气中燃烧)
女朋友不理你怎么办表情包_女朋友不理你怎么办
南京两大厦间现龙卷风:强风至路面闪现火花 每日视点
当前简讯:14代酷睿要来了 英特尔13代酷睿i9包装简化:独特身份消失
预计2025年突破万亿元规模 产学研各方共议储能大赛道
徐州城下城遗址博物馆“上新”
天天热点!金陵十二钗判词及人物(金陵十二钗判词)
每日消息!散水模板工程量怎么计算(算混凝土工程量散水怎么计算)
今日快讯:口腔材料app(口腔材料网)
焦点热议:好高骛远的读音_好高骛远的意思
今日热议:Hbase安装和shell客户端操作
Web安全-渗透测试-信息收集01|全球热文
世界热消息:杯具!上海一小区电动车爆炸起火 家人惨被烧伤:网友吵翻为何电池拿回家充电
莫扎特的一句话(关于莫扎特的话例如说他天真)
世界热点!莫扎特的一句话(关于莫扎特的话例如说他天真)
清远公用品牌IP形象亮相-全球播报
关于铁路计次票、定期票 如何购买使用 环球聚看点
天天视点!多地高温预警 今年618空调没促销降价:还有经销商趁机涨价
龙爸无双100集电视剧免费观看|当前热门
第二届联合国人居大会闭幕 通过“人人享有可负担住房”等决议_百事通
消息!第二届联合国人居大会闭幕 通过“人人享有可负担住房”等决议
中超综合:中超第一阶段结束 上海海港领跑积分榜
中超积分榜:海港领跑三镇仅第8 大连人倒数第一
第34届中国经济新闻奖:21世纪经济报道获评论一等奖、融合报道一等奖 天天精选
全球讯息:武汉到清江画廊旅游攻略_清江画廊旅游攻略
新动态:最美童星长大后惊艳全网!16岁时因“不够性感”被导演刷掉,她霸气怒怼:恶心的猪!
窒息灭火法是指什么_窒息灭火法
全球快资讯:美国旧金山毒品泛滥、暴力犯罪猖獗 市民称正在目睹西方文明崩溃
每日热门:引导资金支持绿色发展 新华碳科技指数发布
这些大胆的古早综艺,真的是不付费就能看的吗? 当前消息
《暗黑破坏神4》差评如潮 跌到5.1分了_世界焦点
最资讯丨蓉火传递启动|“中国民航英雄机组”成员毕楠:当上火炬手,是荣誉也是责任
社区多元化多角度全方位服务新业态新就业群体
以太阳鸟为标志 G985高铁列车因高考火了:网友打卡沾喜气
湖南景区回应游客漂流翻船:第一天开业人多 放水没控制好-即时看
每日一猜6月10日:哪款能重塑眼镜人士新体验 世界快播
热点在线丨7744小游戏盒_7743小游戏
北京铁路:6月15日起,京津城际、京唐城际等线路运行图有调整
五部门联合启动河湖安全保护专项执法行动
全球信息:21个“问界”商标已转让至华为 申请时间为今年3月
9成产品“赚到钱”!部分债基开始限购
每日一猜6月10日:哪款能重塑眼镜人士新体验
上海一兆韦德倒闭_上海一兆韦德团购
大金鼠:你生在冬天还是春天?出生的季节决定财富! 天天新消息
111ttt舞曲网交谊舞曲_111ttt要听舞曲网每天都要听
【世界新视野】投资超2.5亿 电影《红海行动2》正式启动:比肩《战狼》的动作大片
环球快讯:相机功能也开始付费了:理光K-3 Mark III新功能需付费解锁
Zen3游戏神器 AMD锐龙5 5600X3D曝光:售价只要1000多?
杨尚琨简历_万绍芬与杨尚琨关系
天天热资讯!古曲100首经典_古曲
当前热点-淮安多措并举做好“三夏”服务工作
NGINX配置详解
【技术积累】SpringBoot中的简介与配置【一】
龙爸无双100集电视剧免费观看|环球热点评
装饰材料包括什么东西(装饰材料都包括什么) 环球即时看
微软Edge离奇改动:新版不再支持删除云端同步数据
《变形金刚》《蜘蛛侠》不分伯仲:2023暑期档票房破10亿_世界播资讯
乳晕变大是怎么回事(乳晕大怎么回事)-天天热点
证监会就公开募集证券投资基金投资顾问业务管理规定公开征求意见_每日简讯
陕西西安推动“十里沣河”文旅深度融合古老沣河涌动新活力 焦点资讯
低价团乱象再起 何以无解?|头条焦点
四川省社科院周友苏:适合且能推动上市公司高质量发展的规章制度才是“良法善治”|世界短讯
【世界播资讯】【技术积累】Python中的Pandas库【三】
Linux命令篇 - tar 命令
瑞虎8保养灯怎么消除(本田冠道保养灯怎么消除?) 环球速递
王永调研阿洛亚与蜜泉湖联通工程时强调:树立“大景区、大旅游”理念 努力打造全域旅游胜地|每日速递
天天要闻:日本人拆了辆比亚迪海豹 还出了本书 定价6.7万
你买过“游戏盘”么?分析师:无实体游戏将在2028年成主流|资讯
居理买房暴雷!前员工称“欠薪千万元,丈母娘顶替法人” 全球观焦点
ps保存不了jpg格式怎么办(ps保存不)
惩治网暴,公检法三部门公开征求意见!维权难度能降低吗?
湖南博物馆千年古尸_湖南博物馆千年女干尸|焦点关注
焦点速讯:问麻了…阿里一面索命27问,过了就60W+
世界通讯!小迪网安笔记二:信息收集
极目时评丨环卫母亲与高考儿子相拥而泣刷屏,普通人改变命运的努力打动人心
坚守“可靠”坦克Hi4-T 当下新能源越野的更优解 世界播报
当前聚焦:遗体告别仪式流程和掩口流程(遗体告别仪式流程)
国家防总启动防汛四级应急响应,派工作组赴广西福建指导救灾
手机充电很慢是怎么回事呢_手机充电很慢
《猎魔人》S3新预告再惹观众怒火 服装造型太糟糕-当前热闻
我是大运火炬手丨第一棒火炬手邹敬园:我在成都等你们
打新套利动辄千万,“万人摇”乱象丛生,楼市限价将“退出”? 今日热议
西安艺术高级中学网站(西安艺术高级中学)
天津滨海新区可提供伊立浦电压力锅维修服务地址在哪 全球今热点
全球讯息:化疗的时候有什么症状(化疗是什么感觉)