Java基础(学习笔记)之泛型

泛型
Java集合有一个缺点,把一个对象丢进集合中,集合就会忘记这个对象的数据类型,该对象的类型就变为Object类型。Java集合之所以这样设计 因为集合的设计者不知道要存储的类型是什么,为了做到通用性设计为Obejct 。
为了解决这个问题 设计了泛型的概念。 所谓的泛型就是在创建集合的时候指定集合的类型。
1.泛型的使用

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

public class GenericList {
	
	public static void main(String[] args) {
		//在创建集合的时候指定集合的类型  这种行为就是泛型
		List<String> strList =new ArrayList<String>();
		
		strList.add("aaaa");
		strList.add("bbbb");
		strList.add("cccc");
		strList.add("ddddd");
		
//		strList.add(23);
		strList.forEach(str->System.out.println(str.length()));
		
	}
}

2.Java7泛型的菱形语句
Java7的菱形语法 后方的数据类型可以省略 系统会自动判断数据类型
例如:List books =new ArrayList<>();
3.定义泛型类和泛型接口

public class Apple<T> {

	// 使用T类型的参数 定义实例变量
	private T info;

	public Apple() {

	}
	
	public Apple(T info) {
		this.info=info;
	}

	public T getInfo() {
		return info;
	}

	public void setInfo(T info) {
		this.info = info;
	}
	
	
	public static void main(String[] args) {
		Apple<String> al =new Apple<String>("苹果");
		System.out.println(al.getInfo());
		
		Apple<Double> a2 =new Apple<>(3.21);
		System.out.println(a2.getInfo());
	}
	
	
}

4.从泛型类中派生子类

public class DemoA<T> extends Apple<T> {
	//子类继承泛型父类 需要明确数据类型 或者 继续使用泛型
	@Override
	public T getInfo() {
		return super.getInfo();
	}
}
public class DemoB extends Apple<String> {
	
	@Override
	public String getInfo() {
		return "子类"+super.getInfo();
	}
}

5.泛型方法

import java.util.ArrayList;
import java.util.Collection;

public class GenericMethodTest {
	
	//把一个数组中的数据 存储到集合中
	
	public static void fromArrayToCollection(Object [] arr,Collection<Object> coll) {
		for (Object obj : arr) {
			coll.add(obj);
		}
	}
	
	//使用泛型实现上述功能 下方描述这是一个泛型方法
	public static  <T>  void fromArrayToCollectionGeneric(T [] arr,Collection<T> coll) {
		for(T o:arr) {
			coll.add(o);
		}
	}
	
	
	public static void main(String[] args) {
		Object [] oa =new Object[100];
		Collection<Object> co =new ArrayList<>();
		
		fromArrayToCollection(oa,co);
		//下面的代码T代表Object类型
		fromArrayToCollectionGeneric(oa,co);
		
		String [] sa =new String[100];
		Collection<String> cs =new ArrayList<>();
		//下面的代码T代表String类型
		fromArrayToCollectionGeneric(sa,cs);
		
		
		Integer [] ia =new Integer[100];
		Float [] fa =new Float[100];
		Number [] na =new Number[100];
		
		Collection<Number> cn =new ArrayList<>();
		//下面的代码T代表Number类型
		fromArrayToCollectionGeneric(ia,cn);
		fromArrayToCollectionGeneric(fa,cn);
		
		//下面的代码T代表Object类型
		fromArrayToCollectionGeneric(na,co);
		
		//下面的代码报错,其中T代表String类型 而na是NUmber类型 不是String的子类 所以报错
//		fromArrayToCollectionGeneric(na,cs);
		
		
	}
	
	
}

6.泛型擦除和转换
Java中的泛型是假泛型 ,仅仅是在编译期有效,在运行期是不存在的。
当把一个具有泛型信息的对象赋值给另外一个没有泛型信息的变量时候,所有在尖括号之间的类型信息都将被扔掉。

public static void main(String[] args) {
		Apple<Integer> a =new Apple<Integer>(6);
		//as将得到集合大小
		Integer as =a.getSize();
		//把a对象赋值给apple变量b 将丢失尖括号的类型信息 
		Apple b=a;
		//b只只是getSize返回的类型是Number类型 所以不报错
		Number as2=b.getSize();
		//下面的代码将报错  是由于在对b进行赋值丢失了数据类型  所以报错
//		Integer as3 =b.getSize();
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值