java集合中的泛型

news/2025/1/31 1:28:08/文章来源:https://www.cnblogs.com/ishoulgodo/p/18692657

多态

子类类型赋值给父类  Father f1 = New Son(), 
调用子类方法报错。 调用父类方法OK。这个就是多态
public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();// 子类类型赋值给父类Person u1 = new User();// 调用子类方法报错u1.testUser(); // 这里会报错}
}
class Person{public void  testPerson(){System.out.println("我是person");}
}
class User extends Person{public void  testUser(){System.out.println("我是testUser");}
}

为啥会报错

package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);list.add(p1);//	 我们发现取出来会报错?为什么呢User uuu = list.get(0);}
}class Person{public void  testPerson(){System.out.println("我是person");}
}
class User extends Person{public void  testUser(){System.out.println("我是testUser");}
}

为啥会报错:因为我们存储的时候没有约束类型。所以取出来的时候会报错

如何处理

我们可以把它声明为 Object类型,就不会报错了
ArrayList list = new ArrayList();
User u1 = new User();
Person p1 = new Person();
list.add(u1);
list.add(p1);
// 我们可以把它声明为 Object类型
Object uuu = list.get(0);

为啥不能够调用方法

package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);list.add(p1);Object uuu = list.get(0);// 这里调用方法会报错uuu.testUser();}
}
class Person{public void  testPerson(){System.out.println("我是person");}
}
class User extends Person{public void  testUser(){System.out.println("我是testUser");}
}

因为:也是我们在存储的时候没有约束类型。

怎么处理呢? 强制类型的转换

如果想要执行对象u1的方法,需要进行强制类型的转换
package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {ArrayList list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);list.add(p1);//	 我们发现取出来会报错?为什么呢Object uuu = list.get(0);// 强制转换,把uu是Object类型转换为User类型User uu = (User)uuu;// 现在就不会报错了uu.testUser();}
}
class Person{public void  testPerson(){System.out.println("我是person");}
}
class User extends Person{public void  testUser(){System.out.println("我是testUser");}
}

判断是否是某个类型 instanceof

public class goodStudy{public static void main(String[] args) {User u1 = new User();// 判断u1是否是User 类型if(u1 instanceof User){System.out.println("u1是User类型");}}
}class Person{public void  testPerson(){System.out.println("我是person");}
}
class User extends Person{public void  testUser(){System.out.println("我是testUser");}
}

如何约束集合list只能存放某一种(User)类型

package goodStudy;
//ArrayList在java--> util包中
import java.util.ArrayList;
// LinkedList也在java--> util包中
import java.util.LinkedList;public class goodStudy{public static void main(String[] args) {// 约束集合类型只能存放User类型的数据ArrayList<User> list = new ArrayList();User u1 = new User();Person p1 = new Person();list.add(u1);// list.add(p1); 存放Person就会报错的// 现在取数据肯定是User类型的了User u = list.get(0);// 调用User类型的方法u.testUser();}
}class Person{public void  testPerson(){System.out.println("我是person");}
}
class User extends Person{public void  testUser(){System.out.println("我是testUser");}
}

java集合中为啥要引入泛型

1,类型安全,集合中存储Object类型,在我们取出来的时候,需要进行类型转化,不仅繁琐还容易出现问题。
2,提高代码可读性和维护性,当你看到List<User>时,可以立即知道这个列表存储的是User对象

对象和泛型的区别

用于约束外部对象的使用场景就是类型
用于约束内部对象的使用场景就是泛型

有些时候也把泛型称为类型参数

public class goodStudy{public static void main(String[] args) {// 现在,MyCont这里是被修饰了的。只能存放 Novel类型的MyCont<Novel> my =new MyCont();// 因为Object不是Novel类型的,所以会报错my.data = new  Object(); // 会报错// my.data = new Novel();// 不会报错}
}class MyCont<C>{public C data;
}class Novel{}

泛型不存在多态的使用

public class goodStudy{public static void main(String[] args) {// 现在,MyCont这里是被修饰了的。只能存放 Novel类型的MyCont<Novel> my =new MyCont();// 为啥这里会报错呢?// 因为:类型存在多态的使用,泛型不存在多态的使用test(my);}// MyCont类型,约束是对象类型的public static void test(MyCont<Object> cont){System.out.print("hiehie");}
}class MyCont<C>{public C data;
}class Novel{}

分析上述问题

public static void test(MyCont<Object> cont){System.out.print("hiehie");
}
在这一行代码中,MyCont类型的使用 Object 进行约束。
虽然MyCont<Novel> my =new MyCont(); 中my是Object类型的子类型。
但是:在泛型不存在多态的使用。所以就会存在问题
我们可以理解为:
用水果袋子去装水果,正常来说:去装苹果香蕉没有问题,但是我买了一个榴莲。
装水果的袋子就等同于装榴莲的袋子吗? 不等同对吧。
所以:泛型不存在多态的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876264.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中链表LinkedList

复习一下: ArrayList在java哪一个包中? ArrayList在java --> util包中 import java.util.ArrayList; LinkedList LinkedList: 可以在集合前面增加数据,也可以在后面增加数据,还可以在数据之间增加数据。 LinkedList 新增add package goodStudy; //ArrayList在java-->…

2025-1-21-简易登录界面的实现

前端 我们需要两个输入框,一个登录按钮,像这样(为了好看,用的是element-ui的组件,使用的话需要先去下载文件引用)代码如下系统<el-form ref="form" :model="user" label-width="80px"><el-form-item label="用户名">…

SSM

Spring Framework系统架构学习路线一、核心概念 代码书写现状:耦合度偏高 解决方案:使用对象时,在程序中不要主动使用new产生对象,转换为有外部提供对象 IOC(Inversion of Control)控制反转:对象的创建控制权由程序转移到外部,这种思想称为控制反转 目标:充分解耦 Spr…

2025寒假集训

1.斜率优化dp 以例题P3628 [APIO2010] 特别行动队 设\(f[i]\)为以\(i\)结尾最大的修正战斗力 易得状态转移方程\(f[i]=max(f[j]+a*(s[i]-s[j])^2+b*(s[i]-s[j])+c)\) 其中\(1 \le j \le i-1\) 把方程化简得:\(f[i]=f[j]+a*s[i]^2-2*a*s[i]*s[j]+a*s[j]^2+b*s[i]-b*s[j]+c\) 将含…

REST风格 -2025/1/20

REST风格入门 package com.stdu.controller;import com.stdu.domain.Book; import com.stdu.domain.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;@Controller public class BookController {@RequestMapping(v…

manim边学边做--时针方向变换

今天介绍的两个动画类ClockwiseTransform和CounterclockwiseTransform, 用于将某一个元素按照时针方向变换为另一个对象。ClockwiseTransform:将一个对象以顺时针方向变换成另一个对象 CounterclockwiseTransform:将一个对象以逆时针方向变换成另一个对象1. 动画概述 1.1. C…

ADALM-Pluto修改芯片类型为AD9364模式

ADALM-Pluto 使用芯片AD9363(325 MHz - 3.8 GHz),但可切换至 AD9364(70 MHz - 6 GHz)模式,此篇随笔将采用串口调试的方式将 Pluto 设置为 AD9364 芯片,进而提高接收信号频率范围,已包含FM广播信号的频率。ADALM-Pluto 使用芯片AD9363(325 MHz - 3.8 GHz),但可切换至…

java基础Day8 异常

一、简单分类 三种类型的异常Exception:检查性异常:最具代表性的检查性异常是用户错误或者问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常:运行时异常是可能被程序员避免的异常。与…

《CPython Internals》读后感

一、 为什么选择这本书? Python 是本人工作中最常用的开发语言,为了加深对 Python 的理解,更好的掌握 Python 这门语言,所以想对 Python 解释器有所了解,看看是怎么使用C语言来实现Python的,以期达到对 Python语言的掌握达到精通的程度,。 关于 Python 解释器的书不多—…

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及,用户迫切需要将纸质文档快速、准确地转换成电子格式,以提高工作效率和信息管理的便捷性。同时,用户将文档扫描成电子版后,可以自行通过加密和访问控制提高电子文档的安全性,以满足法律和合规要求。 HarmonyOS SDK 场景化视觉服务(V…