Java泛型

本文深入讲解Java泛型的概念与应用,包括泛型类、泛型方法、泛型接口及自定义泛型等内容,并探讨了泛型通配符的使用场景。

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

泛型类:

/**
 * 泛型类:类名后面尖括号,里面一般使用T代表type,K、V分别代表key、value,E代表element
 * 使用时确定类型
 * 注意:
 * 1、泛型只能使用引用类型如Integer,不能使用基本数据类型
 * 2、泛型声明时不能使用在静态属性和静态方法上,因为他们定义时必须确定类型,如果使用泛型,编译不通过
 * @author 30869
 *
 */
public class Generic_Test<T1,T2> {
	private T1 javaScore;
	private T2 oracleScore;
	
		
	
	public T1 getJavaScore() {
		return javaScore;
	}
	public void setJavaScore(T1 javaScore) {
		this.javaScore = javaScore;
	}
	public T2 getOracleScore() {
		return oracleScore;
	}
	public void setOracleScore(T2 oracleScore) {
		this.oracleScore = oracleScore;
	}
	//public static void test(T1 t){};//不允许
	//public static T1 i;
	public static void main(String[] args) {
		Generic_Test<String, Integer> generic=new Generic_Test<String,Integer>();
		//使用泛型属性:1、检查类型,2、类型转换
		generic.setJavaScore("64789");
		generic.setOracleScore(123456);
		String javaScore=generic.getJavaScore();
		int oracleScore=generic.getOracleScore();//自动拆箱(Integer)
	}
}



泛型方法:

/**
 * 泛型方法:只能访问对象信息,不能修改
 * @author 30869
 *
 */
public class Generic_method {
	
	
	
	public static <T> void test(T t){
		System.out.println(t);
		//t=789;//不能修改
	}
	public static void main(String[] args) {
		test("asd");//t--->String
	}
}


泛型接口:

/**
 * 泛型接口:泛型字母只能用在方法中,不能用于全局常量
 * @author 30869
 *
 */
public interface Generic_interface<T> {
	void generic(T t);
}

泛型通配符:

import java.util.ArrayList;
import java.util.List;

public class Fruit {
	/**
	 * 通配符?上限:extends <= 
	 * 即子类 或自身 * 一般用于限制操作 不能使用在添加数据,一般是使用在读取数据上
	 * 
	 * 通配符?下限:super >= 
	 * 即父类或自身 不能添加父类数据
	 * 
	 * 泛型嵌套 泛型没有多态 泛型没有数组
	 * 
	 * JDK1.7 创建对象时不用指定具体类型
	 *     Object
	 *        | 
	 *      Fruit
	 *       / \ 
	 *   Apple Pear 
	 *     | 
	 * FujiApple
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// extends 为上限
		Test<Fruit> t1 = new Test<Fruit>();
		Test<Apple> t2 = new Test<Apple>();
		Test<Pear> t3 = new Test<Pear>();
		Test<FujiApple> t4 = new Test<FujiApple>();

		// 调用方法
		List<? extends Fruit> list1 = new ArrayList<Fruit>();
		test(list1);
		List<Fruit> list2 = new ArrayList<Fruit>();
		test(list2);
		List<Apple> list3 = new ArrayList<Apple>();
		test(list3);
		List<Pear> list4 = new ArrayList<Pear>();
		test(list4);
		List<FujiApple> list5 = new ArrayList<FujiApple>();
		test(list5);
		// ? extends Apple
		List<? extends Apple> list6 = new ArrayList<FujiApple>();
		test(list6);
	}

	// ? extends Fruite
	public static void test(List<? extends Fruit> list) {

	}

	/**
	 * 泛型类
	 * 
	 * @author 30869
	 *
	 * @param <T>
	 */
	static class Test<T extends Fruit> {

	}
}

class Apple extends Fruit {

}

class Pear extends Fruit {

}

class FujiApple extends Apple {

}


自定义泛型:

/**
 * 自定义泛型,继承
 * 父类,子类的应用
 * @author 30869
 *子类泛型大于等于父类
 *属性类型:
 *子类中 :随子类定
 *父类中 :随父类定
 *方法重写:同一随父类定
 *
 *接口同理
 */

//父类使用泛型
public abstract class Custom_generic<T> {
	T name;
	public abstract void test(T t);
}
//类型在使用时确定具体类型
//声明子类属性也只能是该类型
//方法同理
 class child extends Custom_generic<String>{

	@Override
	public void test(String t) {
		this.name="456";//name 同时也是声明父类泛型时的类型String
	}
	
}
 /**
  * 子类为泛型
  * @author 30869
  *
  * @param <T>
  */
//实现类(子类)为泛型类,泛型需一致,不能少
 class child2<T> extends Custom_generic<T>{

	@Override
	public void test(T t) {
		
	}
	 
 }
 /**
  * 子类为泛型,父类类型不指定
  * @author 30869
  *
  * @param <T1>
  * @param <T2>
  */
 class child3<T1,T2> extends Custom_generic{//泛型的擦除,使用Object替换

	@Override
	public void test(Object t) {
		
	}
	 
 }
 /**
  * 子类父类同时擦除,自动Object替换
  * 属性类型可自定义,泛型不可用
  * @author 30869
  *注意:不能子类擦除,父类指定,要么父类擦除,要么同时擦除,要么指定类型
  */
 class child4 extends Custom_generic{
	 String name;
	 //T age;
	@Override
	public void test(Object t) {
		
	}
	 
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值