java的泛型使用

Posted 美好心境

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的泛型使用相关的知识,希望对你有一定的参考价值。

前言

首先,咱们得先说说什么是泛型?泛型,即"参数化类型",就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式,然后再使用时传入具体的类型。

举个例子:

ArrayList<String> strList = new ArrayList<String>(); 
ArrayList<Integer> intList = new ArrayList<Integer>();  
ArrayList<Double> doubleList = new ArrayList<Double>();

ArrayList没有针对每个类型分别实现一个套类,而是将类型作为参数进行了传递,不一样的是这里通过两个尖括号<>进行传递。

泛型的定义和使用

1. 一个简单的泛型使用

class Point<T> {
	private T x ;
	private T y ;
	
	public void setX(T x){//作为参数  
		this.x = x ;  
	}  
	
	public void setY(T y){  
		this.y = y ;  
	}  
    
    public T getX(){//作为返回值  
        return this.x ;  
    }  
    
    public T getY(){  
        return this.y ;  
    }  
};  

 //IntegerPoint使用  
Point<Integer> p = new Point<Integer>() ;   
p.setX(new Integer(100)) ;   
System.out.println(p.getX());    
  
//FloatPoint使用  
Point<Float> p = new Point<Float>() ;   
p.setX(new Float(100.12f)) ;   
System.out.println(p.getX());  

多泛型变量定义及字母规范

多泛型变量定义

class MorePoint<T, U>{  
}

就是在原来的T后面用逗号隔开,写上其它的任意大写字母即可,相加几个就加几个,比如我们想加五个泛型变量,那应该是这样的:

class MorePoint<T, U, A, B, C>{  
}

字母规范

任意一个大写字母都可以,他们的意义是完全相同的,但为了提高可读性,大家还是用有意义的字母比较好,一般来讲,在不同的情境下使用的字母意义如下:

  • E — Element,常用在java Collection里,如:List,Iterator,Set
  • K,V — Key,Value,代表Map的键值对
  • N — Number,数字
  • T — Type,类型,如String,Integer等等

如果这些还不够用,那就自己随便取吧,反正26个英文字母呢。再重复一遍,使用哪个字母是没有特定意义的!只是为了提高可读性!

泛型接口定义及使用

interface Info<T>{        // 在接口上定义泛型    
	public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型    
	public void setVar(T x);  
}

与泛型类的定义一样,也是在接口后面加尖括号。

泛型函数定义及使用

上面讲述了类和接口的泛型使用,下面说说如何单独在一个函数里使用泛型,比如我们在新建一个普通的类StaticFans,然后在其中定义了两个泛型函数:


    public class StaticFans {  
        //静态函数  
        public static  <T> void StaticMethod(T a){  
            Log.d("harvic","StaticMethod: "+a.toString());  
        }  
        //普通函数  
        public  <T> void OtherMethod(T a){  
            Log.d("harvic","OtherMethod: "+a.toString());  
        }  
    }  

上面分别是静态泛型函数和常规泛型函数的定义方法,与以往方法的唯一不同点就是在返回值前面加上来表示泛型变量,其它没什么区别,使用如下:


    //静态方法  
    StaticFans.StaticMethod("adfdsa");//使用方法一  
    StaticFans.<String>StaticMethod("adfdsa");//使用方法二  
      
    //常规方法  
    StaticFans staticFans = new StaticFans();  
    staticFans.OtherMethod(new Integer(123));//使用方法一  
    staticFans.<Integer>OtherMethod(new Integer(123));//使用方法二  

返回值中存在泛型

上面我们的函数中,返回值都是void,但现实中不可能都是void,有时,我们需要将泛型变量返回,比如下面这个函数:

    public static <T> List<T> parseArray(String response,Class<T> object){  
        List<T> modelList = JSON.parseArray(response, object);  
        return modelList;  
    }  

函数返回值是List类型。至于传入参数Class object的意义,我们下面会讲。这里也就是想通过这个例子来告诉大家,泛型变量其实跟String,Integer,Double等等的类的使用上没有任何区别,T只是一个符号,可以代表String,Integer,Double……这些类的符号,在泛型函数使用时,直接把T看到String,Integer,Double……中的任一个来写代码就可以了。唯一不同的是,要在函数定义的中在返回值前加上标识泛型;

用Class类传递

有时,我们会遇到一个情况,比如,我们在使用JSON解析字符串的时候,代码可以这样写:

    public static List<SuccessModel> parseArray(String response){  
        List<SuccessModel> modelList = JSON.parseArray(response, SuccessModel.class);  
        return modelList;  
    }  

但是,更加好的写法是这样:

    public static <T> List<T> parseArray(String response,Class<T> object){  
        List<T> modelList = JSON.parseArray(response, object);  
        return modelList;  
    }  

注意到,我们用的Class object来传递类的class对象,即我们上面提到的SuccessModel.class。这是因为Class也是一泛型,它是传来用来装载类的class对象的,它在jdk中的定义如下:

 public final class Class<T> implements Serializable {  
    …………  
} 

定义泛型数组

在写程序时,大家可能会遇到类似String[] list = new String[8];的需求,这里可以定义String数组,当然我们也可以定义泛型数组,泛型数组的定义方法为 T[],与String[]是一致的,下面看看用法:

    //定义  
    public static <T> T[] fun1(T...arg){  // 接收可变参数    
           return arg ;            // 返回泛型数组    
    }    
    //使用  
    public static void main(String args[]){    
           Integer i[] = fun1(1,2,3,4,5,6) ;  
           Integer[] result = fun1(i) ;  
    }    

我们先看看 定义时的代码:

 public static <T> T[] fun1(T...arg){  // 接收可变参数    
       return arg ;            // 返回泛型数组    
}   

首先,定义了一个静态函数,然后定义返回值为T[],参数为接收的T类型的可变长参数。如果有同学T…arg的用法不了解,可以去找下JAVA 可变长参数方面的知识。由于可变长参数在输入后,会保存在arg这个数组中,所以,我们直接把数组返回即可。

参考文档:

  • [1] https://www.cnblogs.com/jpfss/p/9928747.html

以上是关于java的泛型使用的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Java中的泛型

java中的泛型

java中的泛型的使用与理解

泛型的泛型的好处

java中的泛型

Kotlin 中的泛型