泛型的简单了解

定义

Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

注:参数化类型。数据类型不同,数据类型的位置是变量,随着变量值的不同,数据类型也不同。

泛型的优点

  • 提高了代码的复用性
  • 将运行期的类型转换异常,转变成编译期的检测,减少了异常的发生
  • 避免了向下转型。

泛型的格式

<标识符>
标识符 一般都是使用一个大写英文字母,这个字母一般使用E K V T 来进行表示 ,其中 E element 元素, K Key 键, V value 值,T type 类 ,但是这些字母只是表示字母含义,没有实际意义。只是大家一般这么使用

泛型的分类

泛型类

  • 声明格式

class 类名<泛型,泛型,泛型>{
     语句体;
}

  • 代码实现
class A<T,M>{//多个泛型之间使用,隔开
	public void fun(T a,M b) {
		
	}
}

泛型接口

  • 声明格式

interface A{
    语句体;
}

  • 泛型接口的两种实现形式
    • 泛型具体,子类可以不带泛型
interface A<T>{
	public abstract void fun();
}

class AImpl implements A<String>{

	@Override
	public void fun() {
				
	}	
}
  • 泛型不具体,子类也需要带泛型
	interface A<T>{	//接口中定义泛型
		public abstract void fun();
	}
	
	class AImpl<T> implements A<T>{ //当子类需要的类型也不确定的时候,作为实现子类也需要带泛型		
		@Override
		public void fun() {		
		}	
	}

泛型方法

  • 声明格式

权限修饰符 修饰符<泛型>返回值类型 方法名称(参数){
  
        }

  • 代码实现
class A<M>{
	//T 表示的泛型仅在该方法中使用,该类的其它方法不使用。
	public <T>void fun(T a,M b) {
		
	}
	//静态方法 只能使用泛型方法,不能使用类或接口上的泛型。
	public  static <K>void fun2(K a) {
		
	}
}

注:类或者接口的泛型只能用在非静态方法中,不能用于静态方法,对于静态方法,只能使用泛型方法的形式。

泛型的特点

  • 菱形技术(类型推断)
     1.7jdk开始的 ,可以通过类型推断 推断出后面的类型。
    举例:ArrayList<String> list=new Arraylist<>()
  • 可擦除技术
     在.class文件中没有泛型的存在,已经编译成为普通代码块
  • 泛型在创建的时候才会具体。

泛型中通配符的使用详解

  • 通配符的使用

当数据类型不知道写哪个的时候,可以使用泛型的统配符 ?

import java.util.ArrayList;
public class Test {
	public static void main(String[] args) {
		//给ArrayList集合中添加不同的种类数据类型的数据
		ArrayList<Student> alist = new ArrayList<>();
		ArrayList<Teacher> alist2 = new ArrayList<>();
		A a = new A();
		//将ArrayList集合对象传到方法中
		a.fun(alist);
		a.fun(alist2);	
	}
}
class A{
	//创建方法的时候,给fun()方法传递参数时,不知道在ArrayList集合中放什么类型的数据,这里可以使用通配符
	//但是经过测试,不加泛型也是没有问题的,但是会有警告
	public void fun(ArrayList<?> arr) {
		
	}
}
class Student{}
class Teacher{}
  • 泛型的上限限定: 该T适配于这个类和它的子类

格式 : <? extends T >

public class Test {
	public static void main(String[] args) {
		//这里可以放LittleDog,Dog
		ArrayList<LittleDog> list = new ArrayList<>();
		fun(list);
	}
	public static void  fun(ArrayList<? extends Dog>  list) {
		
	}
}
//类的关系
class  Animal{
	
}
class Dog extends Animal{
	
}
class LittleDog extends Dog{
	
}
  • 泛型的下限限定:该T适配于这个类和它的父类

格式 :<? super T>

public class Test {
	public static void main(String[] args) {
		//这里可以放Animal和Dog,否则会报错
		ArrayList<Animal> list = new ArrayList<>();
		fun(list);
	}
	public static void  fun(ArrayList<? super Dog>  list) {
		
	}
}
//类的关系
class  Animal{
	
}
class Dog extends Animal{
	
}
class LittleDog extends Dog{
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值