Java中的泛型
泛型的本质是将类型参数化,即将所操作的数据类型编程一个参数。
特性:Java中的泛型只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型相关信息擦除,不会进入运行阶段。在逻辑上是多个不同的类型,实际上都是相同的类型。
class GeneralType <Type>{
Type object;
public GeneralType(Type object){
this.object = object;
}
public Type getObj(){
return object;
}
}
public class Test{
public static void main(String[] args){
GeneralType<Integer> i =
new GeneralType<Integer>(2);
GeneralType<Double> d =
new GeneralType<Double>(0.33);
System.out.println("i.object = " + (Integer)i.getObj());
System.out.println("i.object=" + (Integer)d.getObj()); //编译错误
}
}
1.泛型方法
class GeneralMethod{
<Type>void printClassName(Type object){
System.out.println("object.getClass().getName()");
}
}
public class Test{
public static void main(String[] args){
GeneralMethod gm = new GeneralMethod();
gm.printClassName("Hello");
gm.printClassName(3);
gm.printClassName(3.0f);
gm.printClassName(3.0);
}
}
//使用?作为 通配符
class GeneralType <Type>{
Type object;
public GeneralType(Type object){
this.object = object;
}
public Type getObj(){
return object;
}
}
class ShowType{
public void show(GeneralType<?> o){
System.out.println(o.getObj().getClass().getName());
}
}
public class Test{
public static void main(String[] args){
ShowType st = new ShowType();
GeneralType<Integer> i = new GeneralType<Integer>(2);
GeneralType<String> s = new GeneralType<String>("Hello");
st.show(i);
st.show(s);
}
}
//运行结果
java.lang.Integer
java.lang.String
有限制的泛型
在参数Type后面使用extends关键字并加上类名或者接口名,表明参数所代表的类型必须是该类的子类或者实现了该接口。对于实现了某接口的有限制泛型,也是使用extends关键字,而不是implements关键字。
class GeneralType <Type extends Number>{
Type object;
public GeneralType(Type object){
this.object = object;
}
public Type getObj(){
return object;
}
}
class ShowType{
public void show(GeneralType<?> o){
System.out.println(o.getObj().getClass().getName());
}
}
public class Test{
public static void main(String[] args){
ShowType st = new ShowType();
GeneralType<Integer> i = new GeneralType<Integer>(2);
GeneralType<String> s = new GeneralType<String>("Hello");//非法,T只能是Number或Number的子类
st.show(i);
st.show(s);
}
}
浙公网安备 33010602011771号