java 泛型使用场景_泛型的使用场景,可以作用在什么位置,使用泛型有什么好处...

1.什么是泛型,泛型有什么用,为什么要用

1.1 泛型就是一种未知的类,将未知的类型声明在集合、对象上,泛型的默认类型为Object。

例如: ArrayList str = new ArrayList();

这是将String类型指定在str这个集合内,这个集合存储或者读取的类型只能为String类型。

1.2 使用泛型可以在传参的时候(使用占位符 ? 占位)不固定传入什么类型,即可通用类型,

如果不设置泛型的上限(例如:< ? extends List>)和下限(例如: super List>)。

1.3 使用泛型后对象或者集合内只能放入指定的数据类型,可以保证对象或者集合的安全性,减少类型的转换操作。

2.怎么使用泛型,泛型可以作用在什么位置

2.1 有以下几种使用场景以及放在那种位置

泛型只能定义引用数据类型,而不能使用基本数据类型

泛型类、泛型方法、泛型接口、泛型通配符

例如:作用在类上时( public class Animal { E pet; } ) , 泛型跟在类后边,可以指定用了泛型的类内部的 pet 的类型。

作用在对象上时( Animal str = new Animal(); ) , 泛型跟在类后边 , 使得对象类的的 pet 属性为 Dog类型。

作用在方法上时( public Animal getPet(){ return E ; } ), 如在类上没有声明泛型时,必须在返回值和访问修饰符之间声明。

作为方法入参时( public void setPet(E pet){ this.pet = pet ; } ), 如在类上没有声明泛型时,必须在返回值和访问修饰符之间声明。

3.使用泛型的好处

3.1 使用泛型后对象或者集合内只能放入指定的数据类型,避免出现对象或者集合内的对象在多态使用的时候出现类型转换异常(java.lang.ClassCastException),可以保证对象或者集合的安全性。

3.2 指定了类型后,对象、集合或方法内只能使用对应的类型,可以减少类型的转换操作(在没有指定类型是类型转换必须使用 instanceof 关键字来进行判定),缩减了代码了,方便了程序员。

下面以代码的形式讲解

声明在类上时,写在类名后边

packagecom.jq;/*** 声明在类上时,写在类名后边

*@param*/

class Animal {/*** 作为属性声明时,必须在类上声明泛型*/E pet;/*** 作为参数或者返回值时,如果在类上没有声明,必须在访问修饰符和返回值之间

*@parampet*/

public voidsetPet(E pet){this.pet =pet;

}publicE getPet(){returnpet;

}public voidcall(T t){

System.out.println( t.toString() );

}

}

使用泛型实现时,实现类必须使用对应的泛型类。

实现类声明泛型跟接口指定泛型可以同时使用。

packagecom.jq;/*** 作用在接口上,如果实现该接口时指定实现类型

*@param*/

public interface Animals{voidcall(T t);

}/*** 拉布拉多犬*/

/*** 使用泛型实现时,实现类必须使用对应的泛型类。

* 实现类声明泛型跟接口指定泛型可以同时使用。

*如下代码:*/

class LaBuLaDuo implements Animals{public voidcall(String s) {

System.out.println( s );

}

}

泛型占位符 ? 的使用

如何设置泛型的上限下限

packagecom.jq;/*** 小狗狗*/

class Dog extendsAnimal {publicString name;publicInteger age;

}/*** 泛型占位符 ? 的使用

* 泛型的上限 < ? extends E> 即传入参数必须为E 的子类

* 泛型的下限 < ? super E>*/

public class ErHa {//当参数传递时可以设置上下限 比如下面的是 传入类型必须是 Dog 的子类,上限为Dog

public void call(Animal< ? extends E>s){

System.out.println(s.pet);

}//传入类型必须是 Dog 的父类,下限为Dog

public void jump(Animal< ? super E>s){

System.out.println(s.pet);

}//? 占位符单独使用时,相当于 < ? extends Object >

public void smile(Animal>s){

System.out.println(s.pet);

}public static voidmain(String[] args) {new ErHa().call(newDog());

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值