一.泛型:本质是将类型参数化
栗子:泛型类
class GeneralType <Type> //<>里将类型作为参数, 可以用一个泛型类 来构造不同类型的对象
{
Type object;
public GeneralTyper(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类,它的属性是什么类型的
GeneralType<Double> d = new GeneralType<Double> (0.33);
System.out.println("i.object=" + (Integer)i.getObj() );
System.out.println("d.object=" + (Integer)d.getObj() ); //错误! d是double类型来构造的GeneralType对象,它的obj返回的是double对象
}
}
栗子:泛型方法
class GeneralMethod
{
<Type> void printClassName(Type object) //用type作为类型参数 泛型方法让所接收的参数的类型可订制
{
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 = objcet;
}
public Type getObj()
{
return object;
}
}
class ShowType
{
public void show(GeneralType<?> o) //show方法接收的参数对象,是GeneralType传入的不同的类型实参构造的对象
{
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); //运行结果: java.lang.Integer
st.show(s); //运行结果: java.lang.String
}
}
二.有限制的泛型
1.在参数"Type"后面使用"extends"关键字并加上类名或接口名,表明参数所代表的类型必须是该类的子类或者实现了该接口
2.注意:对于实现了某接口的有限制泛型,也是使用extends关键字,而不是implements关键字
class GeneralType <Type extends Number> //Type类型必须是Number的子类
{
Type object;
public GeneralType(Type object)
{
this.object = objcet;
}
public Type getObj()
{
return object;
}
}
public class Test
{
public static void main(String[] args)
{
GeneralType<Integer> i = new GeneralType<Integer> (2);
GeneralType<String> s = new GeneralType<String> ("hello"); //错误!String不是Number的子类
}
}