JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0。这说明Java已经有大幅度的变化。本文将讲解JDK5.0支持的新功能-----Java的泛型.
1、Java泛型
其实Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和str2,也是可变。
编写泛型类要注意:
1) 在定义一个泛型类的时候,在 “<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示类型。
2) 实例化泛型对象的时候,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。例如:
TestGen<String,String> t=new TestGen<String,String>();
3) 泛型中<K extends Object>,extends并不代表继承,它是类型范围限制。
普通泛型
Java代码
classPoint<T>{ // 此处可以随便写标识符号,T是type的简称
privateT var ; // var的类型由T指定,即:由外部指定
publicT getVar(){ // 返回值的类型由外部决定
return
}
publicvoidsetVar(T var){ // 设置的类型也由外部决定
this.var = var ;
}
};
publicclass
publicstaticvoid
newPoint<String>() ; // 里面的var类型为String类型
"it") ; // 设置字符串
// 取得字符串的长度
}
};
----------------------------------------------------------
classNotepad<K,V>{ // 此处指定了两个泛型类型
privateK key ; // 此变量的类型由外部决定
privateV value ; // 此变量的类型由外部决定
public
returnthis.key ;
}
public
returnthis.value ;
}
publicvoid
this.key = key ;
}
publicvoid
this.value = value ;
}
};
publicclass
publicstaticvoid
null; // 定义两个泛型类型的对象
newNotepad<String,Integer>() ; // 里面的key为String,value为Integer
"汤姆") ; // 设置第一个内容
20) ; // 设置第二个内容
"姓名;" + t.getKey()) ; // 取得信息
",年龄;" + t.getValue()) ; // 取得信息
}
};
通配符
Java代码
class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<String>() ; // 使用String为泛型类型
"it") ; // 设置内容
fun(i) ;
}
publicstaticvoidfun(Info<?> temp){ // 可以接收任意的泛型对象
"内容:"
}
};
受限泛型
Java代码
class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<Integer>() ; // 声明Integer的泛型对象
newInfo<Float>() ; // 声明Float的泛型对象
30) ; // 设置整数,自动装箱
30.1f) ; // 设置小数,自动装箱
fun(i1) ;
fun(i2) ;
}
publicstaticvoidfun(Info<?extendsNumber> temp){ // 只能接收Number及其Number的子类
"、") ;
}
};
----------------------------------------------------------
class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<String>() ; // 声明String的泛型对象
newInfo<Object>() ; // 声明Object的泛型对象
"hello") ;
new
fun(i1) ;
fun(i2) ;
}
publicstaticvoidfun(Info<?superString> temp){ // 只能接收String或Object类型的泛型
"、") ;
}
};
泛型无法向上转型
Java代码
class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<String>() ; // 泛型类型为String
null
//这句会出错 incompatible types
}
};
泛型接口
Java代码
interfaceInfo<T>{ // 在接口上定义泛型
publicT getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
}
classInfoImpl<T>implementsInfo<T>{ // 定义泛型接口的子类
privateT var ; // 定义属性
publicInfoImpl(T var){ // 通过构造方法设置属性内容
this.setVar(var) ;
}
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
};
publicclass
publicstaticvoid
null; // 声明接口对象
newInfoImpl<String>("汤姆") ; // 通过子类实例化对象
"内容:"
}
};
----------------------------------------------------------
interfaceInfo<T>{ // 在接口上定义泛型
publicT getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
}
classInfoImplimplementsInfo<String>{ // 定义泛型接口的子类
privateString var ; // 定义属性
publicInfoImpl(String var){ // 通过构造方法设置属性内容
this.setVar(var) ;
}
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
};
publicclass
publicstaticvoid
null; // 声明接口对象
newInfoImpl("汤姆") ; // 通过子类实例化对象
"内容:"
}
};
泛型方法
Java代码
class
public<T> T fun(T t){ // 可以接收任意类型的数据
returnt ; // 直接把参数返回
}
};
publicclass
publicstaticvoid
newDemo() ; // 实例化Demo对象
"汤姆") ; // 传递字符串
inti = d.fun(30) ; // 传递数字,自动装箱
// 输出内容
// 输出内容
}
};
通过泛型方法返回泛型类型实例
Java代码
classInfo<TextendsNumber>{ // 指定上限,只能是数字类型
privateT var ; // 此类型由外部决定
public
returnthis.var ;
}
publicvoid
this.var = var ;
}
publicString toString(){ // 覆写Object类中的toString()方法
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
30) ;
System.out.println(i.getVar()) ;
}
publicstatic<TextendsNumber> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定
newInfo<T>() ; // 根据传入的数据类型实例化Info
// 将传递的内容设置到Info对象的var属性之中
returntemp ; // 返回实例化对象
}
};
使用泛型统一传入的参数类型
Java代码
classInfo<T>{ // 指定上限,只能是数字类型
privateT var ; // 此类型由外部决定
public
returnthis.var ;
}
publicvoid
this.var = var ;
}
publicString toString(){ // 覆写Object类中的toString()方法
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
new
new
"HELLO") ; // 设置内容
"汤姆") ; // 设置内容
add(i1,i2) ;
}
publicstatic<T>void
" "
}
};
泛型数组
Java代码
publicclass
publicstaticvoid
1,2,3,4,5,6) ; // 返回泛型数组
fun2(i) ;
}
publicstatic<T> T[] fun1(T...arg){ // 接收可变参数
returnarg ; // 返回泛型数组
}
publicstatic<T>voidfun2(T param[]){ // 输出
"接收泛型数组:") ;
for(T t:param){
"、") ;
}
}
};
泛型的嵌套设置
Java代码
classInfo<T,V>{ // 接收两个泛型类型
private
private
public
this.setVar(var) ;
this.setValue(value) ;
}
publicvoid
this.var = var ;
}
publicvoid
this.value = value ;
}
public
returnthis.var ;
}
public
returnthis.value ;
}
};
class
private
public
this.setInfo(info) ;
}
publicvoid
this.info = info ;
}
public
returnthis.info ;
}
};
publicclass
publicstaticvoid
null; // 将Info作为Demo的泛型类型
null; // Info指定两个泛型类型
newInfo<String,Integer>("汤姆",30) ; // 实例化Info对象
newDemo<Info<String,Integer>>(i) ; // 在Demo类中设置Info类的对象
"内容一:"
"内容二:"
}
};
java 泛型详解(普通泛型、 通配符、 泛型接口)
转载
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
一、泛型类用法、二、泛型方法用法、三、泛型通配符 <?>、四、泛型安全检查、
java 泛型通配符 泛型安全检查 泛型类 泛型方法 -
泛型_泛型接口
1 语法结构泛型接口和泛型类的声明方式一致。泛型接口的具体类型需要在实现类中进
泛型接口 实例化 泛型 -
java 泛型 -- 泛型类,泛型接口,泛型方法
java 泛型 -- 泛型类,泛型接口,泛型方法
泛型 泛型方法 泛型类 类型参数 可变参数