java泛型

本文深入讲解Java泛型的使用,包括基本应用、通配符、受限泛型、泛型与子类继承限制、泛型接口及泛型数组等内容,帮助读者全面理解泛型在Java中的作用和使用场景。

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

1、泛型的基本应用
泛型可以解决数据类型的安全性问题,其主要原理时在类声明时通过一个标识表示类中某个方法的返回值及参数类型。遮掩在类声明或实例化时只要制定好需要的具体类型即可。如:
【访问权限】 class 类名称<泛型类型标识符1,泛型类型标识符2>{【访问权限】 泛型类型标识 变量名称;
【访问权限】 泛型类型标识 方法名称(){};
}

1.1、泛型的使用
例:

package com.shuai.ChapterTen;
/**
 * 泛型
 * @author guai
 *
 */

class Point<T>{
	//此变量类型由外部决定
	private T var;   

	public T getVar() {
		return var;
	}

	public void setVar(T var) {
		this.var = var;
	}
	
}
public class GenericDemo {
	public static void main(String[] args) {
	        //定义对象是指定泛型对象 对象的具体数据类型
		Point<Integer> point=new Point<Integer>();
		point.setVar(30);
		System.out.println("Integer-->"+point.getVar()*2);
		
		
		
		Point <String> point2=new Point<String>();
		point2.setVar("东经10");
		System.out.println("String-->"+point2.getVar());
		
	}
}

结果:
在这里插入图片描述
注意:在设置数据类型时,必须设置一个类,即对于int,float等,必须使用包装类。

1.2、泛型应用中的构造函数
package com.shuai.ChapterTen;

/**
 * 泛型
 * 
 * @author guai
 *
 */

class Point<T> {
	// 此变量类型由外部决定
	private T var;
	//无参构造函数
	public Point() {
	}
	//有参构造函数
	public Point(T var) {
		this.var=var;
	}

	public T getVar() {
		return var;
	}

	public void setVar(T var) {
		this.var = var;
	}

}

public class GenericDemo {
	public static void main(String[] args) {

		Point<String> point2 = new Point<String>("构造函数");
		System.out.println("String-->" + point2.getVar());
		
	}
}

结果:
在这里插入图片描述

1.3、指定多个泛型类型

package com.shuai.ChapterTen;
/**
 * 设置多个泛型类型
 * @author guai
 *
 * @param <T>
 */
class Point1<T,K> {
	// 此变量类型由外部决定
	private T var;
	private K var1;

	public K getVar1() {
		return var1;
	}

	public void setVar1(K var1) {
		this.var1 = var1;
	}

	public T getVar() {
		return var;
	}

	public void setVar(T var) {
		this.var = var;
	}

}

public class MultipleGenerics {
	public static void main(String[] args) {
		Point1<String,Integer> p=new Point1<String,Integer>();
		p.setVar("guai");
		p.setVar1(18);
		System.out.println(p.getVar()+"已经"+p.getVar1()+"岁");
		
	}
}

结果:
在这里插入图片描述

2、通配符

2.1、通配符的使用在使用泛型进行引用传递时需要在接收对象时可以指定泛型类型,也可以不指定,也可以使用通配符来接收任意类型

package com.shuai.ChapterTen
/**
 * 泛型通配符
 * @author guai
 *
 */
class Info<T>{
	private T var;

	public T getVar() {
		return var;
	}

	public void setVar(T var) {
		this.var = var;
	}
}

public class GenericWildcard {
	public static void main(String[] args) {
		Info<String> i=new Info<String>();
		i.setVar("通配符");
		fun(i);
	}
	                        //指定泛型类型
	public static void fun(Info<String> i) {
		System.out.println(i.getVar());
	}
}

结果:
在这里插入图片描述
不指定泛型类型:
在这里插入图片描述

使用通配符 ?
在这里插入图片描述

2.2、受限泛型
在引用传递中,在泛型操作中可以设置一个泛型对象的范围上限和下限,上限使用extends关键字声明,表明泛型的类型可能是所指定的类型或者此类型的子类。上范围下限使用super关键字进行声明,表示泛型的类型可能时所指定的类型,或者时此类型的父类型。
当使用extends却超出上限时报错:
在这里插入图片描述

正常情况:
在这里插入图片描述

3、泛型与子类继承的限制

package com.shuai.ChapterTen;

/**
 * 泛型与子类继承的限制
 * 子类的泛型类型无法使用父类的泛型类型接收
 * @author guai
 *
 */
class Info<T>{
	private T var;

	public T getVar() {
		return var;
	}

	public void setVar(T var) {
		this.var = var;
	}
}
class InfoChile<T> extends Info<T>{
	
}
public class InheritLimit {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 
	}

}

用父类放行类型接收子类的泛型类型:
在这里插入图片描述

正常接收:
在这里插入图片描述

4、泛型接口
【访问权限】 interface 接口名称<泛型标识符>{}
1、在子类的定义上声明泛型类型
2、直接在接口中指定具体类型

package com.shuai.ChapterTen;
/**
 * 泛型接口的定义和两种实现方式
 * @author guai
 *
 * @param <T>
 */
interface info4<T>{
	public T getVar();
}
//在子类的定义上声明泛型类型
class Info4Impl<T> implements info4<T>{
	private T var;
	
	public void setVar(T var) {
		this.var=var;
	}
	
	@Override
	public T getVar() {
		// TODO Auto-generated method stub
		return this.var;
	}
}
//直接在接口中指定具体泛型
class Info4Impl1 implements info4<String>{
	private String var;
	
	public void setVar(String var) {
		this.var=var;
	}
	
	@Override
	public String getVar() {
		// TODO Auto-generated method stub
		return this.var;
	}
}
public class GenericInterfaceDemo {
	public static void main(String[] args) {
		Info4Impl<Integer> info4Impl=new Info4Impl<Integer>();
		info4Impl.setVar(18);
		System.out.println(info4Impl.getVar());
		
		Info4Impl1 info4Impl1=new Info4Impl1();
		info4Impl1.setVar("guai");
		System.out.println(info4Impl1.getVar());
	}

}

结果:
在这里插入图片描述

5、泛型数组

package com.shuai.ChapterTen;

/**
 * 泛型数组
 * @author guai
 *
 */
public class GenericArr {
	public static void main(String[] args) {
		Integer i[]=fun1(1,2,3,4,5);
		fun2(i);
	}
	      //接收可变参数,返回泛型数组
	@SafeVarargs
	public static <T> T[]fun1(T...arg){
		return arg;
	}
	public static <T> void fun2(T paeam[]) {
		System.out.println("接收泛型数组:");
		for(T t:paeam) {
			System.out.println(t+",");
		}
	}
}

结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值