先看这样的代码
1 | public static Integer max(Integer a , Integer b){ |
有了泛型
1 | // 第一步简化代码成这样 |
你可以这样
1 | max(1.0,2.0); // 你传递的是 Double 因此返回是 Double |
让你疑惑的地方
max("aaa",1)
竟然通过了编译为什么?
- 泛型的约束条件是
<T extends Comparable>
- String/Integer 都是 Comparable 的实现类
1 | public static <T extends Comparable> T max (T a, T b){ |
虽然能通过编译,但是运行会报错,在本文最后会解释
传递多个类型
1 | public static <A extends Comparable,B extends Comparable,C extends Comparable> A max2 (A a, B b, C c){ |
取第一个list第一个元素
1 | public static String first(List<String> list){ |
使用泛型后
1 | public static <T> T first(List<T> list){ |
泛型的绑定
? extends
要求泛型是某种类型及其子类型? super
要求泛型是某种类型及其父类型Collections.sort
按照参数绑定
1 | public static <T extends Comparable> T max (T a, T b){ |
按照返回值绑定
让一个方法的返回值根据接受者动态的去改变
1 | public class Main { |
? super xx
1 | package com.loder.demo; |
翻车问题重现
max("aa",1)
通过编译,但是运行报错?
- 通过编译时因为刚才说了
String/Integer都是 Comparable 的子类型
- 报错是因为Comparable没有泛型参数 导致传入的是一个裸类型
1 | public class Main { |
修改代码
1 | public static <T extends Comparable<T>> T max (T a, T b){ |
练习
1 | public class Main { |
1 | package com.github.hcsp.generics; |