泛型基础知识

Java 泛型

最近终于期末考试结束了,小林开始了武汉漫长炎热的暑假,趁着暑假想把之前的java基础知识在复习一遍,今天小林复习了泛型,我的天呢,感觉不是在复习,完全是在重新学习,好多都忘了。真是令人汗颜,看来以后要多加复习了

1 .概述

  • 它的本质是参数化类型,将类型由原来的具体的类型参数化,然后在使用/调用是传入具体的类型

2. 格式

  • <类型>:指定一种类型的格式,这里的类型可以看作是形参
  • <类型1,类型2,…>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型可以看作是形参
  • 将来调用是给定的类型必须是实参,并且实参的类型只能是引用数据类型

3.泛型的好处

  • 把运行期间的问题提前到了编译期间
  • 避免了·强制类型转化

4.泛型类

  • 格式:修饰符 class 类名<类型>()

  • 范例:public class Ceneric()

    • 此处的T可以随便写为任喜标识

      import javax.xml.crypto.Data;
      import java.util.ArrayList;
      import java.util.Date;
      import java.util.Scanner;
      
      /**
       * The type Test.
       */
      
      public class test {
      
          public static void main(String[] args) {
              student s=new student();
              s.setName("张无忌");
              System.out.println(s.getName());//输出 张无忌
      
              Teacher t=new Teacher();
              t.setAge(30);
              System.out.println(t.getAge());//30
      
      //        Teacher t=new Teacher();
      //        t.setAge("30");报错 传入的参数应为int类型
      //        System.out.println(t.getAge());//
      
              Generic<String> g1=new Generic<String>();//T为String类型
              g1.setT("张无忌");
              System.out.println(g1.getT());//输出 张无忌
      
              Generic<student> g2=new Generic<>();//T为student类型
              g2.setT(s);
              System.out.println(g2.getT().getName());//输出张无忌
          }
      }
      
      class Generic<T>{//使用泛型 传入的参数是什么类型则T为什么类型
          private T t;
      
          public T getT() {
              return t;
          }
      
          public void setT(T t) {
              this.t = t;
          }
      }
      
      class student{
          private String name;
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
      
      class Teacher{
          private int age;
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      }
      

5.泛型方法

  • 格式:修饰符<类型>返回值类型 方法名(类型 变量名){}

    • 范例:public void show(T t){}

      import java.util.ArrayList;
      import java.util.Collection;
      import java.util.Iterator;
      
      public class test1 {
          public static void main(String[] args) {
              //正常操作
              Genrics1 g1=new Genrics1();
              g1.show("张无忌");//输出 张无忌
              g1.show(30);//输出30
              g1.show(true);//输出true
      
              //使用泛型类
              Genrices2<String> g2=new Genrices2<>();
              g2.show("张无忌");//输出 张无忌
              Genrices2<Integer> g22=new Genrices2<>();
              g22.show(30);//输出 30
              Genrices2<Boolean> g222=new Genrices2<>();
              g222.show(true);//输出 true
      
              //使用泛型方法
              Genrices3 g3=new Genrices3();
              g3.show("张无忌");
              g3.show(30);
              g3.show(true);
      
          }
      }
      
      class Genrics1{
          public void show(String s){
              System.out.println(s);
          }
      
          public void show(Integer i){
              System.out.println(i);
          }
      
          public void show(Boolean b){
              System.out.println(b);
          }
      }
      
      class Genrices2<T>{
          public void show(T t){
              System.out.println(t);
          }
      }
      
      class Genrices3{
          public<T> void show(T t){
              System.out.println(t);
          }
      }
      

6.泛型接口

  • 格式:修饰符 interface 接口名<类型>()

  • 范例:public interface Generic ()

  • 首先建立一个Generic的泛型接口

    package test3;
    
    public interface Generic<T>{
        void show(T t);
    }
    
  • 创建一个类 来继承这个接口

package test3;

public class Genericimp<T> implements Generic<T>{
    @Override
    public void show(T t){
        System.out.println(t);
    }

    public static void main(String[] args) {
        Genericimp<String> stringGenericimp = new Genericimp<String>();
        stringGenericimp.show("张无忌");//输出 张无忌
    }
}

7.类型通配符

  • 为了表示各种泛型List的父类 ,可以使用类型通配符<?>

  • List<?>表示元素类型未知的List,它的元素可以匹配任何的类型

  • 这种带通配符的list仅表示它是各种List的父类,并不能把元素添加到其中

  • 类型通配符的上限表示:<?extends 类型>

  • 类型通配符的下限表示:<?super 类型>

  • package test3;
    
    import javax.jnlp.ClipboardService;
    import java.util.ArrayList;
    import java.util.List;
    
    public class test3{
        public static void main(String[] args) {
            List<?>list1=new ArrayList<Object>();
            List<?>list2=new ArrayList<Number>();
            List<?>list3=new ArrayList<Integer>();
    
    
            //List<?extends Number> list4=new ArrayList<Object>();//报错 Object 是Number的上限
            List<?extends Number> list5=new ArrayList<Integer>();
    
            //List<?super Number>list6=new ArrayList<Integer>();//报错 Integer是Number的下限
            List<?super Number> list7=new ArrayList<Object>();
        }
    }
    

8.可变参数

  • 可变参数又称参数可变,用做方法的形参出现,那么方法的参数个数就是可变的了

  • 格式:修饰符 返回值类型 方法名(数据类型…变量名){}

  • 范例:public static int sum(int …a){}

  • package test3;
    
    import javax.jnlp.ClipboardService;
    import java.util.ArrayList;
    import java.util.List;
    
    public class test3{
        public static int sum(int ...a){
            int num=0;
            for(int i:a){
                num=num+i;
            }
            return num;
        }
        public static void main(String[] args) {
            System.out.println(sum(1,2,3,4));
        }
    }
    
  • 这里的变量a实际上是一个数组,

  • 如果一个方法有多个参数,且包含可变参数,可变参数要放到最后

我如果有什么地方出错,欢迎大家告诉小白。
一起加油!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值