学习笔记---Java中的泛型简单使用

Java 泛型

Java 泛型是 JDK5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

  1. 泛型方法

    写一个泛型方法,该方法调用时可以接收不同类型的参数,根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

    定义泛型方法规则:

    • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前
    • 每一个类型参数声明部分包括一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
    • 类型参数能被用来声明返回值类型,并且能够作为泛型方法得到的实际参数类型的占位符
    • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用类型,不能是原始类型(int,char 等)

    自定义一个泛型方法用于输出不同类型的数组数据

    public class Test {
        public static void main(String[] args) {
            //创建不同类型的数组
            Integer[] intArray = {1,2,3,4,5};
            Double[] doubleArray = {1.1,1.2,1.3,1.4,1.5};
            Character[] charArray = {'A','B','C','D','E'};
    
            printArray(intArray);
            printArray(doubleArray);
            printArray(charArray);
        }
        //定义一个泛型方法 printArray,用于打印数组
        public static <E> void printArray(E[] inputArray){
            for (E e : inputArray) {
                System.out.print("  "+e);
            }
            System.out.println();
        }
    }
    
    运行结果:
      1  2  3  4  5
      1.1  1.2  1.3  1.4  1.5
      A  B  C  D  E 
    
  2. 泛型类

    泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分;和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,用于指定一个泛型类型名称的标识符。因为它们接收一个或多个参数,这些类被称为参数化的类或参数化的类型。

    //定义一个泛型类
    public class Test<T> {
        private T t;
        public void add(T t){
            this.t = t;
        }
        public T get(){
            return t;
        }
        public static void main(String[] args) {
            Test<Integer> integerTest = new Test<>();
            integerTest.add(10);
            System.out.println(integerTest.get());
        }
    }
    
    运行结果:
        10
    
  3. 类型通配符

    1. 类型通配符一般是使用 ?代替具体的类型参数,List<?> 在逻辑上 List,List 等所有 List<具体类型实参> 的父类

      public class Test {
      
          public static void main(String[] args) {
              List<String> strings = new ArrayList<String>();
              List<Integer> integers = new ArrayList<Integer>();
              strings.add("aaa");
              integers.add(20);
              getData(strings);
              getData(integers);
          }
          //因为 getData() 方法参数是 List<?>,所以不同类型的都可以作为这个方法的实参,这就是通配符
          public static void getData(List<?> data){
              System.out.println(data.get(0));
          }
      }
      
      运行结果:
      	aaa
          20
      
    2. 类型通配符上集成 Number,则通配符泛型值接收 Number 及其下层子类类型

      public class Test {
      
          public static void main(String[] args) {
              List<String> strings = new ArrayList<String>();
              List<Integer> integers = new ArrayList<Integer>();
              strings.add("aaa");
              integers.add(20);
              //会报错,因为方法中的参数限定了参数泛型上限为 Number,所以泛型为String不是这个范围内。
      //        getData(strings);
              getData(integers);
          }
          public static void getData(List<? extends Number> data){
              System.out.println(data.get(0));
          }
      }
      
      运行结果:
          20
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值