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类型的子类型。
但是:在泛型不存在多态的使用。所以就会存在问题
我们可以理解为:
用水果袋子去装水果,正常来说:去装苹果香蕉没有问题,但是我买了一个榴莲。
装水果的袋子就等同于装榴莲的袋子吗? 不等同对吧。
所以:泛型不存在多态的使用。
posted @   何人陪我共长生  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示