Java 泛型

泛型概念

泛型是一种未知的数据类型,可以看成一个变量用来接受数据类型
如ArrayList 在定义时 不知道会接受什么样的数据类型

ArrayList<E> // E 表示未知的数据类型

在创建集合对象时,就会确定泛型的数据类型

ArrayList <String> list = new ArrayList <string>();

String 作为参数传递给 E

泛型的好处

创建集合对象,不使用泛型

  • 好处:集合不使用泛型,默认类别为Object类,可以存储任意类型的数据
  • 坏处:不安全,会引发异常
    使用泛型
    好处:
  • 避免了类型转换的麻烦,存储什么类型,取出就什么类型
  • 运行期异常在编译期就会显示(在写代码就是报错)
    坏处
  • 泛型是什么类型,就只能存储什么类型的数据

泛型的使用

泛型的定义

public class GenericClass<E>{
	private E name;
	public E getName(){
		return name;
	}
	public E setName(E name){
		this.name = name;
	}
	public static void main(String []args){
		//不写泛型默认为Object类型
		GenericClass gc = new GenericClass();
		gc.setName("name");
		Object obj = gc.getName
		// 创建GenericClass对象,泛型使用String类型
		GenericClass<String> gc2 = new GenericCClass<>();
		gc2.setName("Jack");
		String name1 = gc2.getName();
	}
}

含有泛型的方法

在调用方法时确定泛型的数据类型
传递什么类型的参数 泛型就是什么类型

public class GenericClass{
	public <M> method(M m){
		System.out.println(m);
	}
	public static <S> method2(S s){
		System.out.println(s);
	}
	public static void main(String []args){
		//不写泛型默认为Object类型
		GenericClass gc = new GenericClass();
		gc.method("abc");
		gc.method(1);
		gc.method(8.8);
		gc.method(true);
		gc.method2("静态方法,不建议创建对象使用");
		GenericClass.method2("静态方法");
		GenericClass.method2(1);
	}
}

含有泛型的接口

public interface GenericInterface<I>{
	public abstract void method(I i);
}
//第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型
/*
public interface Iterator<E>{
	E next();
}
Scanner类实现了Iterator接口 并指定接口泛型为String 重写的next方法泛型默认为String
public final class Scanner implements Interator Iterator<String>{
	public String next(){...}
}
*/
public class GenericInterfaceImpl_1 implenments GenericInterface<String>{
	@Override
	public void method(String s){
		System.out.println(s);
	}
}
/*
第二钟使用方式:接口使用什么泛型 实现类就用什么类型 类跟接口走 
相当于定义一个泛型的类 创建对象时确定泛型的类型
public interface List<E>{
	boolean add(E e);
	E get(int index);
}
public class ArrayList<E> implements List<E>{
	public boolean add(E e){...}
	public E get(int index){...}
}
*/
// 实现类不用指定
public class GenercClassImpl_2 implements GenericClass{
	@Override
	public void method(I i){
		System.out.println(i);
	}
}
//在创建时指定类型
public static void main(String []args){
	GenericInterfaceImpl_2<String> gc2 = new GenericInterfaceImpl_2<>();
	gc2.method("namr");
}

泛型通配符 “?” :代表任意的数据类型

“?” :代表任意的数据类型

不能创建对象使用
只能作为方法的参数使用

public class Gnenric{
	public static void main(String [] args){
		ArrayList<Integer> list_1 = new ArrayList<>();
		list_1.add(1);
		ArrayList<String> list_2 = new ArrayList<>();
		list_2.add("jack");
	}
	/*
	错误写法:
	public static void printArray(ArrayList<Object> list){...}
	泛型没有继承概念
	*/
	public static void printArray(ArrayList<?> list){
		Iterator<?> it = list.iterator();
		while(it.hasNext()){
			Object p = it.next();
			System.out.println(o);
		}
	}
}

泛型通配符——受限泛型

泛型上限 ?extends E 代表使用的泛型只能是E类型的子类/本身
泛型上限 ?super E 代表使用的泛型只能是E类型的父类/本身

视频来源:https://www.bilibili.com/video/BV1T7411m7Ta/?p=246

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值