JAVA泛型笔记(自用)

泛型

集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象JDK1.5之前只能把元素的类型设计为object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他部分都是确定的,例如这个元素怎么保存,如何管理等是确定的因此此时把元素设计成一个参数,这个类型参数叫做泛型。Collection< E > List< E > ArrayList< E > 这个 < E >就是类型参数,即泛型。

为什么要有泛型?
1.解决元素存储安全性问题, 好比商品` 药品标签,不会弄错。

2.解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品,药品都要辨别。

集合未使用泛型之前 :

问题一 : list.add(1) list.add(2)…这时可能混入不是这个类型的数据 如 list.add(“hhh”) 类型不安全。。。。。。

问题二 : 强转时,可能出现ClassCastException异常 因为可能有混进来的别的类型数据 所以强转可能会失败抛出异常。

在集合中使用泛型的情况

注意 使用泛型时不能是基本数据类型 需要使用其包装类

ArrayList < Integer > list =new ArrayList< Integet >();

编译时就会进行类型检查 ,保证数据的安全,避免了强转操作

此时遍历的操作
方法一: for(Integer s : list){
int s1=s;
System.out.pritln(s1);
}

方法二 :
Iterator < Integer > iterator = list.iterator();

while(iterator.hasNext())
{
int s =iterator.next();
System.out.pritln(s);
}

Map中的使用举例

Map ,<String,Integer> map =new HashMap<String,Interger>();

map.put(“Tom”,11);

泛型的嵌套 好好理解一下

Set <Map.Entry<String,Integer>> entry =map.entrySet(); //set 带泛型 entry 也带泛型

Iterator <Map.Entry<String,Integer>> iterator =entry.iterator();

while (iterator.next())
{
Map.Entry<String ,Integer> e =iterator.next();

String key =e.getKey();
Integer.Value =e.getValue();
System.out.pritln(key + value );
}

在集合中使用泛型 总结 :

1.在JDK5.0在之后 集合接口或集合类都修改为带泛型的结构

2.在实例化集合类时,可以指明泛型类型

3.指明完以后,在集合类或接口中凡是定义类或接口时内部结构使用到类的泛型的位置都指定为实例化的泛型类型。

4.泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换。

5.如果实例化时没有使用泛型 默认为object 类型。

如何自定义泛型结构: 泛型类 泛型接口 泛型方法

public class order < T >
{
T orderT;
public T getOrderT(){

return orderT;
}
public void setOrderT(T orderT){
this .orderT =orderT;
}
}

如果定义了泛型类,实例化没有知名类的泛型,则认为此泛型类型为object 类型。
如果定义了泛型类 建议在实例化时要指明类的泛型。

Order < String > order1 =new Order< String >();

如果子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时不再需要指明泛型。

泛型类的构造器是public s (){} 不是 public s< E >(){}

静态方法不能使用泛型类

异常类不能泛型的

异常类数组 T[] arr = (T[]) new Object [10];

子父类

在这里插入图片描述

泛型方法 : 在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系,换句话说,泛型方法所属的类是不是泛型泛型类都没有关系。
简单的使用 说明 : 第一个< E >是为了给系统说明不是有个类叫< E > 而是 告诉它我要使用泛型 泛型方法调用时指明泛型参数类型,给类的类型没有关系。

public < E > List < E > x (E[] arr){
ArrayList < E > list =new ArrayList<>();
for(E e: arr){
list.add(e)
}
return list;
}

泛型方法可以是静态方法

泛型在继承方面的体现
类A是类B的父类,G< A > 和G< B >二者不具备子父类关系,二者是并列关系。
类A是类B的父类 A< G >是B< G >的父类

List < object > list1 =null; List< String> list2 =null; list1=list2 是不对的编译不通过

通配符的使用 通配符: ? 类A是类B的父类,G< A > 和G< B >二者不具备子父类关系 二者共同父类是G<?>

List < object > list1 =null;

List< String> list2 =null;

List<?> list=null;

list=list1; list=list2; 此时就是ok的了

对于List< ? > 就不能向其内部添加数据 除了添加null之外 可以读

3.有限制条件的通配符的使用

<? extends Person> 理解为<= <?super Person> 理解为>=
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值