java集合中的泛型
多态
子类类型赋值给父类 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类型的子类型。
但是:在泛型不存在多态的使用。所以就会存在问题
我们可以理解为:
用水果袋子去装水果,正常来说:去装苹果香蕉没有问题,但是我买了一个榴莲。
装水果的袋子就等同于装榴莲的袋子吗? 不等同对吧。
所以:泛型不存在多态的使用。
作者:流年少年
出处:https://www.cnblogs.com/ishoulgodo/
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
出处:https://www.cnblogs.com/ishoulgodo/
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!
万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

支付宝

微信
如果文中有什么错误,欢迎指出。以免更多的人被误导。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)