泛型-Java集合框架基础

本文深入探讨了Java中的泛型,包括泛型类的声明与使用、泛型接口的定义以及泛型在实际编程中的应用。通过实例展示了如何创建泛型类对象,如何限制泛型范围以及泛型在类型安全数据结构中的重要作用。泛型的使用消除了强制类型转换的需求,提高了代码的可读性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.泛型

泛型主要目的是建立具有类型安全的集合框架,如链表,散列映射等数据结构。

详细内容查看Oracle Java Technologies | Oracle

泛型类

使用"class 名称<泛型列表>"声明一个类 这种类叫泛型类

class People<E>

E指其中的泛型,并没有指定E是何种类型的数据,它可以是任意类或接口,但不能是基本数据类型

“泛型列表”给出的泛型可以作为类的成员变量的类型,方法的类型以及局部变量的类型

泛型类的类体和普通类的类体完全类似,由成员变量和方法构成。

class Cone<E>{
    double height;
    E bottom;
    public Cone(E b){
        buttom = b;
    }
}

使用泛型类声明对象

泛型类声明和创建对象时,类名后多了一对“<>”,而且要用具体的类型替换“<>”中的泛型(或使用通配“?”)

使用具体类型替换“<>”中的泛型,例如,具体类型Circle替换泛型E:

Circle circle = new Circle();
Cone<Circle> coneOne;//用具体类型Circle,不可以用泛型E:Cone<E> coneOne;
coneOne = new Cone<Circle>(circle);

使用统配“?”

泛型类声明对象时,可以使用通配符“?”来限制泛型的范围。例如:限制泛型E的范围:

Cone<? extends Geometry> coneOne;

如果Geometry是类,那么<? extends Geometry>中的“:?extends Geometry”表示任何Geometry类的子类或Geometry类本身;如果Geometry是接口,那么<? extends Geometry>中的“:?extends Geometry”表示任何实现Geometry接口的类。

j假设Geometry是接口,CIrcle是实现了Geometry接口的类,那么下列创建coneOne就是合法

Circle circle = new Circle();
coneOne = new Cone<Circle>(circle);
Cone<? super B>coneOne;

这里B必须是一个类,不可以是接口,“<? super B>”中的":?super B"表示B类的任何父类(包括B类本身)

泛型类声明对象时,也可以仅仅使用通配符“?”代表泛型E,但不限制泛型E的范围(“?”),创建对象时,必须用具体的类,

Circle circle = new Circle();
Cone<?>coneOne = new Cone<Circle>(circle);

下列定义了一个Cone<E>泛型类,一个Cone<E>的对象计算体积时,只关心它的底是否能计算面积,并不关心底的类型

Cone.java

public class Cone<E> { //泛型类
	double height; 
	E bottom; //用泛型E声明对象bottom
	
	public Cone(E b) {
		bottom = b;
	}
	
	public void setHeight(double h) {
		height = h;
	}
	
	public double computerVolume() {
		String s = bottom.toString(); //泛型变量只能调用从Object类继承的或重写的方法
		double area = Double.parseDouble(s);
		return 1.0/3.0*area*height;
	}

}

Computable.java

public interface Computable {
	public String toString();
}

Rect.java


public class Rect implements Computable {
	double sideA,sideB,area;
	Rect(double a,double b){
		sideA = a;
		sideB = b;
	}
	public String toString() {
		area = sideA + sideB;
		return ""+area;
	}
}

Circle.java


public class Circle implements Computable{
	double area,radius;
	Circle(double r){
		radius = r;
	}
	public String toString() { //重写Object类的toString()方法
		area = radius*radius*Math.PI;
		return ""+area;
		
	}
}

main.java

public class Example13_1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Circle circle = new Circle(10);
		Cone<? extends Computable>cone = new Cone <Circle>(circle); //使用限定字符“?”限定实现接口
		cone.setHeight(16);
		System.out.println(cone.computerVolume());
		
		Rect rect = new Rect(15,23);
		cone = new Cone<Rect>(rect);  //方锥对象
		cone.setHeight(98);
		System.out.println(cone.computerVolume());
		
		Cone<Rect>coneRect = new Cone<Rect>(rect);  //不使用限定符“?”
		coneRect.setHeight(198);
		System.out.println(coneRect.computerVolume());
		
		Cone<?>coneCircle = new Cone <Circle>(circle);
		coneCircle.setHeight(100);
		System.out.println(coneCircle.computerVolume());
	}
}

泛型接口

使用”interface 名称<泛型列表>“声明一个接口

interface Computer<E>

Computer是泛型接口的名称,E是其中的泛型,泛型类可以使用泛型接口

interface Computer<E,F>{
	void makeChorus(E x,F y);
}

class Chorus<E,F> implements Computer<E,F>{
	public void makeChorus(E x,F y) {
		x.toString();
		y.toString();
	}
}

class 乐器{
	public String toString() {
		System.out.println("|3 5 1-|1 3 5 - |12 35 2 - |");
		return "";
	}
}

class 歌手{
	public String toString() {
		System.out.println("阿巴阿巴阿巴阿巴阿巴。。。。");
		return "";
	}
}

public class Example13_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Chorus<歌手,乐器>model = new Chorus<歌手,乐器>();
		歌手 pengliyuan = new 歌手();
		乐器 piano = new 乐器();
		model.makeChorus(pengliyuan, piano);
	}
}

java泛型的主要目的是建立具有类型安全的数据结构,如链表,散列表等。

在使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值