泛型的使用

泛型类

通过泛型类限定类中参数的类型,最经典的就是List,Set,Map了,定义了泛型,传入的参数只能是定义的类型

  1. //限定了ArrayList的参数只能是String类型,后面的<>可写可不写
  2. ArrayList<String> a = new ArrayList<>();
  3. a.add("啊啊");
  1. public class test1 {
  2. public static void main(String[] args) {
  3. //实例化了一个自定义泛型类对象
  4. testClass<String> aa =new testClass<>();
  5. String bb = aa.method1("只能传入一个String类型");
  6. }
  7. }
  8. //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
  9. //在实例化泛型类时,必须指定T的具体类型
  10. class testClass <T>{
  11. //定义一个泛型方法,返回值类型为T,T的类型由外部指定,参数类型也是T
  12. T method1(T num){
  13. return num;
  14. }
  15. }

自定义泛型类可以传入多个泛型,用逗号隔开: 使用时不传入泛型类型,默认是Object任意类型

泛型接口

和泛型类基本一样

  1. public class test1 {
  2. public static void main(String[] args) {
  3. //实例化了一个自定义泛型类对象
  4. testClass<String> aa =new testClass<>();
  5. String bb = aa.method1("只能传入一个String类型");
  6. int cc = aa.next(123);//接口实现时泛型限定的是Integer类型,重写接口的方法,用的就是接口里面的类型
  7. }
  8. }
  9. //实现接口时指明类型,也可以不指明,默认Object
  10. class testClass <T> implements testInterface<Integer>{
  11. //定义一个泛型方法,返回值类型为T,T的类型由外部指定,参数类型也是T
  12. T method1(T num){
  13. return num;
  14. }
  15. //重写接口方法
  16. @Override
  17. public Integer next(Integer num) {
  18. return num*10;
  19. }
  20. }
  21. //定义一个泛型接口
  22. interface testInterface<K> {
  23. public K next(K num);
  24. }

泛型方法

  1. public class test1 {
  2. public static void main(String[] args) {
  3. String aa = testMethod(new testClass<String>(),"参数");
  4. System.out.println(aa);
  5. }
  6. //定义一个泛型方法,返回类型由外部决定,传入传输是一个自定义类的泛型对象对象
  7. //返回值最好和传入参数一致
  8. public static <S> S testMethod(testClass<S> ts,String a){
  9. //返回类型强转成S,有风险,不建议这么写,这里只是测试
  10. return (S)ts.method1((S)a);
  11. }
  12. }