JAVA笔记—泛型

目录

为什么要有泛型?

 泛型的概念

 泛型的使用

类型推断--jdk7新特性

 ArrayList list = new ArrayList<>();

自定义泛型写法:

 关于类继承于泛型类_情况一

继承类无泛型

 继承泛型类的类的实现

 继承泛型类实现-情况二

继承类有泛型

 子类依然需要指定类型

 使用泛型的注意事项

泛型方法:

通配符的使用

通配符(?)

使用通配符的读取和写入操作

 有限制条件的通配符

 读取和写入操作


为什么要有泛型

 泛型的概念

 泛型的使用

//在集合中使用泛型的情况
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
//以上添加均为整型,添加成功

lisst.add("Test");
//添加的数据不为整型时,添加失败
//因为编译时会进行类型检查,保证了数据的安全

类型推断--jdk7新特性

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

//通过类型推断,后面的Integer可以省略

自定义泛型写法:

声明

 实例化

 关于类继承于泛型类_情况一

继承类无泛型

 继承泛型类的类的实现

 继承泛型类实现-情况二

继承类有泛型

 子类依然需要指定类型

 使用泛型的注意事项

1.泛型类可能有多个参数,此时应该讲多个参数一起放在尖括号内。<T1,T2,T3>

2.泛型类的构造器声明方式:正确--->public GenericClass( ){ }

                                               错误--->public GenericClass<T>( ){ }

3.实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。

4.泛型不同的引用不能相互赋值。

>尽管在编译时ArrayList<String>和ArrayList<Integer>是两种类型,但

是在运行时只有一个ArrayList被加载到JVM中。

5.泛型如果只定义不使用,将被擦除,泛型对应的类型均按照Object处理<Object>

但是不等价于Object。

6.泛型要是使用就一直使用,不然就一直不用。

7.jdk7开始有类型推断,所以实例化时可以简写为

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

8.泛型的指定中不能使用基本数据类型,可以使用包装类代替

9.在类/接口上声明的泛型,在本类或本接口中既代表某种类型,可以作为非静态属性

的类型,非静态方法的参数类型,非静态方法的返回值类型。但在静态方法中不能使

用泛型。

10.异常类不能是泛型的。

11.不能使用new T【】。但是可以T【】elements = (T[ ])new Object[capacity];

12.父类有泛型,子类可以选择保留泛型,也可以选择指定泛型类型。

泛型方法:

泛型方法:在泛型中出现了泛型的结构,泛型参数与类的泛型没有关系。与泛型所属的类是不是泛型没有关系。

泛型方法可以为静态-泛型参数在调用时确定而不是实例化时确定。

通配符的使用

通配符(?)

情况:类A是类B的父类,G<A>,G<B>----->两者没有关系,

两者共同的父类是G<?>。

 @Test
    public void test1(){
        List<Integer> list1 = null;
        List<Integer> list2 = null;

        List<?> list = null;

        list = list1;
        list = list2;
    }

使用通配符的读取和写入操作

 有限制条件的通配符

1.<?>允许所有泛型的引用调用

2.通配符指定上限:上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,既<=

3.通配符指定下限:下限super:使用时指定的类型不能小于操作的类,既>=

List<? extends Person> list1 = null;
List<? super Person> list2 =null;

List<Student> list3 = new ArrayList<Student>();
List<Person> list4 = new ArryaList<Person>();
List<Object> list5 = new ArrayLiat<Object>();

//编译通过
list1 = list3;
list1 = list4;
//编译不通过
list1 = list5;

//编译不通过
list2 = list3;
//编译通过
list2 = list4;
list2 =list5;

 读取和写入操作

//读取数据
list1 = list3;
Person p = list1.get(0);
//编译不通过情况
Student s = list1.get(0);

list2 = list4;
Object obj = list2.get(0);
//遍历不通过情况
Person obj = list2.get(0);

//写入数据
//编译不通过
list1.add(new Student());

//编译通过
list2.add(new Person());
list2.add(new Student());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mao.O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值