泛型的结构
【访问权限】 class 类名称 <泛型类型1,泛型类型2>
{
【访问权限】 泛型类型标示 变量名称;
}
类名称<具体类> 对象名称 = new 类名称<具体类>();
eg:
public class F <T1,T2>
{
private T1 t1;
private T2 t2;
}
F<String> f = new F<String>();
适配符:?
接受泛型变量的时候如果不知道泛型的具体类型,那么如果想要接收对象那么可以使用适配符(?)使用方法是
public void fun( F<?> f)
{}
如果使用? 意味着可以接受任意的内容,但是此内容无法直接使用<?> 修饰的泛型变量进行修改(声明变量时候不能直接使用?)
使用? 设置上下限
设置上限
声明中:
public void fun(F<? extends Number> f)
{}
表示传入的?不能超过Number 如不能使用String这个类
定义中:
public class F <T1 extends Number>
{
private T1 t1;
}
F<String> f = new F<String>(); 这是错的超过上限了
F<Integer> f = new F<Integer>();
设置下限
public void fun(F<? super String> f)
{}
只能使用本类及其父类 例子中只能使用String 和Object 类型
泛型的方法:
class Test
{
public <T>T fun(T t)
{
return t;
}
}
通过泛型的方法返回泛型类的实例
eg
class Info<T extends Number>{ // 指定上限,只能是数字类型
private T var ; // 此类型由外部决定
public T getVar(){
return this.var ;
}
public void setVar(T var){
this.var = var ;
}
public String toString(){ // 覆写Object类中的toString()方法
return this.var.toString() ;
}
};
public class GenericsDemo27{
public static void main(String args[]){
Info<Integer> i = fun(30) ;
System.out.println(i.getVar()) ;
}
public static <T extends Number> Info<T> fun(T param){
Info<T> temp = new Info<T>() ; // 根据传入的数据类型实例化Info
temp.setVar(param) ; // 将传递的内容设置到Info对象的var属性之中
return temp ; // 返回实例化对象
}
};
使用泛型统一传入参数类型
class Info<T>{
private T var ; // 此类型由外部决定
public T getVar(){
return this.var ;
}
public void setVar(T var){
this.var = var ;
}
public String toString(){ // 覆写Object类中的toString()方法
return this.var.toString() ;
}
};
public class GenericsDemo28{
public static void main(String args[]){
Info<String> i1 = new Info<String>() ;
Info<String> i2 = new Info<String>() ;
i1.setVar("HELLO") ; // 设置内容
i2.setVar("李兴华") ; // 设置内容
add(i1,i2) ;
}
public static <T> void add(Info<T> i1,Info<T> i2){
System.out.println(i1.getVar() + " " + i2.getVar()) ;
}
};