Android泛型

注意:本篇文章是本人阅读相关文章所写下的总结,方便以后查阅,所有内容非原创,侵权删。

本篇文章内容来自于
夯实JAVA基本之一 —— 泛型详解(1):基本使用
夯实JAVA基本之一——泛型详解(2):高级进阶

目录

  1. 各种泛型定义及使用
    --1.1 泛型类定义及使用
    --1.2 泛型接口定义及使用
    --1.3 泛型函数定义及使用
  2. 多泛型变量定义及字母规范
    --2.1 多泛型变量定义
    --2.2 字母规范
  3. 泛型类型绑定
    --3.1 类型绑定:extends
  4. 通配符
    --4.1 无边界通配符:?
    ----4.1.1 通配符?的extends绑定
    ----4.1.2 通配符?的super绑定

1. 各种泛型定义及使用

1.1 泛型类定义及使用

//定义  
class Point{// 此处可以随便写标识符号   
    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 p = new Point() ;   
p.setX(new Integer(100)) ;   
System.out.println(p.getX());    
  
//FloatPoint使用  
Point p = new Point() ;   
p.setX(new Float(100.12f)) ;   
System.out.println(p.getX());  

1.2 泛型接口定义及使用

定义:

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

使用:
使用方法一:非泛型类

class InfoImpl implements Info{     
 …………  
} 

使用方法二:泛型类

class InfoImpl implements Info{   // 定义泛型接口的子类  
    private T var ;             // 定义属性  
    public InfoImpl(T var){     // 通过构造方法设置属性内容  
        this.setVar(var) ;    
    }  
    public void setVar(T var){  
        this.var = var ;  
    }  
    public T getVar(){  
        return this.var ;  
    }  
}  

--------------------------------------

class InfoImpl implements Info{   // 定义泛型接口的子类  
     private U var ;      
     private T x;  
     private K y;  
     public InfoImpl(U var){        // 通过构造方法设置属性内容  
         this.setVar(var) ;  
     }  
     public void setVar(U var){  
         this.var = var ;  
     }  
     public U getVar(){  
         return this.var ;  
     }  
 } 

1.3 泛型函数定义及使用

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

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

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

2.1 多泛型变量定义

在原来的T后面用逗号隔开,写上其它的任意大写字母即可。

class MorePoint{  
}  

class MorePoint{  
}  

//使用  
MorePoint morePoint = new MorePoint(); 

2.2 字母规范

用于指定泛型的变量是一个大写字母。
使用哪个字母是没有特定意义的,只是为了提高可读性。

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

3. 泛型类型绑定

3.1 类型绑定:extends

  

此定义表示T应该是BoundingType的子类型(subtype)。T和BoundingType可以是类,也可以是接口

另外注意的是,此处的“extends”表示的子类型,不等同于继承。
一定要非常注意的是,这里的extends不是类继承里的那个extends!两个根本没有任何关联。在这里extends后的BoundingType可以是类,也可以是接口,意思是说,T是在BoundingType基础上创建的,具有BoundingType的功能。

绑定多个限定
可以同时绑定多个绑定,用&连接

public static  String getFruitName(T t){  
    return t.getName();  
} 

public static  T foo(T a, U b){  
    …………  
}  

4. 通配符

4.1 无边界通配符:?

通配符的意义就是它是一个未知的符号,可以是代表任意的类。
通配符只能用于填充泛型变量T,不能用于定义变量

实例:生成一个变量,可以将不同类型的实例赋值给他。

Point point;  
  
point = new Point(3,3);  
point = new Point(4.3f,4.3f);  
point = new Point(4.3d,4.90d);  
point = new Point(12l,23l);  
4.1.1 通配符?的extends绑定

表示填充为派生于XXX的任意子类

Android泛型_第1张图片

注意:利用定义的变量,只可取其中的值,不可修改, 能取不能存

4.1.2 通配符?的super绑定

表示填充为任意XXX的父类
能取不能存

结论:
◆ 如果你想从一个数据类型里获取数据,使用 ? extends 通配符(能取不能存)
◆ 如果你想把对象写入一个数据结构里,使用 ? super 通配符(能存不能取)
◆ 如果你既想存,又想取,那就别用通配符。

构造泛型实例时,如果省略了填充类型,则默认填充为无边界通配符!

你可能感兴趣的:(Android泛型)