Java之泛型,什么是泛型?为什么用泛型?(泛型详解)

1.为什么会有泛型呢?
早期的Object类型可以接受任意的对象类型,但是在实际使用中,会有类型转化的问题,存在隐患,所以Java提供泛型解决这个安全问题
2.什么是泛型?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
3.泛型的使用
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
(1) 泛型类
把泛型定义在类上
格式:public class类名<泛型类型,…>
注意:泛型类型 必须是引用类型

//一个泛型类
public class ObjectTool<E> {
private E obj;

public E getObj() {
	return obj;
}

public void setObj(E obj) {
	this.obj = obj;
}
}

 // 泛型类测试  
public class ObjectToolDemo {
public static void main(String[] args) {
	ObjectTool<String> obj=new ObjectTool<String>();
	obj.setObj("张三");
	String s=obj.getObj();
	System.out.println(s);
}
}


(2)泛型方法
把泛型定义在方法上
格式:public<泛型类型>返回类型 方法名(泛型类型)

//泛型方法
public class ObjectTool{
	public <T> void show(T t) {
		
	}
	
}
//测试
public class ObjectToolDemo {
public static void main(String[] args) {
	ObjectTool obj=new ObjectTool();
	obj.show(1);
	obj.show("hello");
	obj.show(true);
	
}
}

(3)泛型接口
把泛型定义在接口上
格式:public interface接口名<泛型类型>

//定义泛型接口
public interface Inter<T> {
public abstract void show(T t);
}
//实现接口
public class InterfaceImpl<T> implements Inter<T>{
public static void main(String[] args) {
}
public void show(T t) {
}
}
//测试
public class InterfaceDemo {
public static void main(String[] args) {
	//接口测试
	Inter<String> i=new InterfaceImpl<String>();
	i.show("hello");
	Inter<Integer> i2=new InterfaceImpl<Integer>();
	i2.show(100);
	Inter<Boolean> i3=new InterfaceImpl<Boolean>();
	i3.show(true);

}
}

4.泛型的好处
Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。
1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
5. 泛型通配符

  • 泛型通配符<?>
    任意类型,如果没有明确,那么就是Object以及任意的Java类
//泛型如果明确写的时候,前后需要一致
		Collection<Object> c1=new ArrayList<Object>();
		//Collection<Object> c2=new ArrayList<Animal>();
		//Collection<Object> c3=new ArrayList<cat>();报错
		//Collection<Object> c4=new ArrayList<dog>();
		
		//?表示任意类型都是可以的
		Collection<?> c2=new ArrayList<Animal>();
		Collection<?> c3=new ArrayList<cat>();
		Collection<?> c4=new ArrayList<dog>();
  • ? Extends E
    向下设定,E及其子类
//? Extends E
		Collection<? extends Animal> c5=new ArrayList<Animal>();
		Collection<? extends Animal> c6=new ArrayList<dog>();
		Collection<? extends Animal> c7=new ArrayList<cat>();
  • ? super E
    向上设定,E及其父类
//向上设定,E及其父类
		Collection<? super Animal> c8=new ArrayList<Object>();
		Collection<? super Animal> c9=new ArrayList<Animal>();
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值