注意:本篇文章是本人阅读相关文章所写下的总结,方便以后查阅,所有内容非原创,侵权删。
本篇文章内容来自于
夯实JAVA基本之一 —— 泛型详解(1):基本使用
夯实JAVA基本之一——泛型详解(2):高级进阶
目录
- 各种泛型定义及使用
--1.1 泛型类定义及使用
--1.2 泛型接口定义及使用
--1.3 泛型函数定义及使用 - 多泛型变量定义及字母规范
--2.1 多泛型变量定义
--2.2 字母规范 - 泛型类型绑定
--3.1 类型绑定:extends - 通配符
--4.1 无边界通配符:?
----4.1.1 通配符?的extends绑定
----4.1.2 通配符?的super绑定
1. 各种泛型定义及使用
1.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());
1.2 泛型接口定义及使用
定义:
interface Info<T>{ // 在接口上定义泛型
public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
public void setVar(T x);
}
使用:
使用方法一:非泛型类
class InfoImpl implements Info<String>{
…………
}
使用方法二:泛型类
class InfoImpl<T> implements Info<T>{ // 定义泛型接口的子类
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<T,K,U> implements Info<U>{ // 定义泛型接口的子类
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 <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));//使用方法二
2. 多泛型变量定义及字母规范
2.1 多泛型变量定义
在原来的T后面用逗号隔开,写上其它的任意大写字母即可。
class MorePoint<T,U>{
}
class MorePoint<T,U,A,B,C>{
}
//使用
MorePoint<Integer,String> morePoint = new MorePoint<Integer, String>();
2.2 字母规范
用于指定泛型的变量是一个大写字母。
使用哪个字母是没有特定意义的,只是为了提高可读性。
E — Element,常用在java Collection里,如:List<E>,Iterator<E>,Set<E>
K,V — Key,Value,代表Map的键值对
N — Number,数字
T — Type,类型,如String,Integer等等
3. 泛型类型绑定
3.1 类型绑定:extends
<T extends BoundingType>
此定义表示T应该是BoundingType的子类型(subtype)。T和BoundingType可以是类,也可以是接口。
另外注意的是,此处的“extends”表示的子类型,不等同于继承。
一定要非常注意的是,这里的extends不是类继承里的那个extends!两个根本没有任何关联。在这里extends后的BoundingType可以是类,也可以是接口,意思是说,T是在BoundingType基础上创建的,具有BoundingType的功能。
绑定多个限定
可以同时绑定多个绑定,用&连接
public static <T extends Fruit&Serializable> String getFruitName(T t){
return t.getName();
}
public static <T extends Comparable & Serializable, U extends Runnable> T foo(T a, U b){
…………
}
4. 通配符
4.1 无边界通配符:?
通配符的意义就是它是一个未知的符号,可以是代表任意的类。
通配符只能用于填充泛型变量T,不能用于定义变量
实例:生成一个变量,可以将不同类型的实例赋值给他。
Point<?> point;
point = new Point<Integer>(3,3);
point = new Point<Float>(4.3f,4.3f);
point = new Point<Double>(4.3d,4.90d);
point = new Point<Long>(12l,23l);
4.1.1 通配符?的extends绑定
<? extends XXX>表示填充为派生于XXX的任意子类
注意:利用<? extends Number>定义的变量,只可取其中的值,不可修改,能取不能存
4.1.2 通配符?的super绑定
<? super XXX>表示填充为任意XXX的父类
能取不能存
结论:
◆ 如果你想从一个数据类型里获取数据,使用 ? extends 通配符(能取不能存)
◆ 如果你想把对象写入一个数据结构里,使用 ? super 通配符(能存不能取)
◆ 如果你既想存,又想取,那就别用通配符。
构造泛型实例时,如果省略了填充类型,则默认填充为无边界通配符!