【java笔记】Java中的泛型和类通配符

泛型

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数

  • E:Element(在集合中使用,因为集合中存放的是元素)
  • T:Type(Java 类)
  • K:Key(键)
  • V:Value(值)
  • N:Number(数值类型)
  • ? :表示不确定的java类型

上述除了?之外的其他通配符在本质上是一样的,实际上用A~Z的任意一个字母都可以,上面列出的只是大家约定俗成常用的几个,它们的优点就是可用做到见名知意。

1. 泛型方法

(1) 类型参数声明和类型参数

public static <T> T 方法名()T为类型参数 ,表示方法的返回值类型,<T>为类型参数声明 ,表示方法为泛型方法。

public class GenericMethodTest
{
   // 泛型方法 printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // 输出数组元素            
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }
 
    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
 
        System.out.println( "整型数组元素为:" );
        printArray( intArray  ); // 传递一个整型数组
 
        System.out.println( "\n双精度型数组元素为:" );
        printArray( doubleArray ); // 传递一个双精度型数组
 
        System.out.println( "\n字符型数组元素为:" );
        printArray( charArray ); // 传递一个字符型数组
    } 
}

(2) 有界类型参数

有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的,其格式为类型参数名称 extends 类型参数上界

public class MaximumTest
{
   // 比较三个值并返回最大值
   public static <T extends Comparable<T>> T maximum(T x, T y, T z)
   {                     
      T max = x; // 假设x是初始最大值
      if ( y.compareTo( max ) > 0 ){
         max = y; //y 更大
      }
      if ( z.compareTo( max ) > 0 ){
         max = z; // 现在 z 更大           
      }
      return max; // 返回最大对象
   }
   public static void main( String args[] )
   {
      System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",
                   3, 4, 5, maximum( 3, 4, 5 ) );
 
      System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",
                   6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
 
      System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear",
         "apple", "orange", maximum( "pear", "apple", "orange" ) );
   }
}

2. 泛型类

泛型类就是在类名后面添加了类型参数声明部分。

public class Test<T> {
    private T name;
    
    public T getName(T name){
        return name;
    }
    
    public static <T> void printA(T a){
        System.out.println(a);
    }
}

以上代码中getName方法是泛型方法,但并没有<T>,这是因为对于声明了<T>的Test类不需要声明泛型方法,对于带了static的方法,它并不属于类的一部分,相当于没有声明<T>的类,所以需要声明为泛型方法

3. 类型通配符

(1) 类型通配符

?被称为类型通配符,例如List<?>在逻辑上是List<String>List<Integer>等所有List<具体类型实参>的父类。

import java.util.*;
 
public class GenericTest {
     
    public static void main(String[] args) {
        List<String> name = new ArrayList<String>();
        List<Integer> age = new ArrayList<Integer>();
        List<Number> number = new ArrayList<Number>();
        
        name.add("icon");
        age.add(18);
        number.add(314);
 
        //getUperNumber(name); // 会报错,因为String不是Number的子类型
        getUperNumber(age);
        getUperNumber(number);
       
   }
 
   public static void getData(List<?> data) {
      System.out.println("data :" + data.get(0));
   }
   
   public static void getUperNumber(List<? extends Number> data) {
          System.out.println("data :" + data.get(0));
   }
}

(2) T?的区别

T是类的泛型,?是对象的泛型

4. <? extends T><? super T>

  • <? extends T> 表示类型的上界,表示参数化类型的可能是T或是T的子类;
  • <? super T>表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值