泛型的特点
1.泛型的类型是什么?谁使用泛型,泛型就是谁的数据类型
2.泛型只能使用包装类,如(integer等)
3泛型中不能使用父类来接收子类
4.当泛型没有定义类型时默认为Object
例:
class Name<T,F>{//定义一个有泛型的类(T,F可以是任何大写的字母)
public T x;//定义一个类型为T的变量x
public F y;//定义一类型为F的变量x
}
public Name(Tx, Fy) {//构造函数
this.x = x;
this.y = y;
}
//set,get方法
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public F getY() {
return y;
}
public void setY(F y) {
this.y = y;
}
}
使用:Name<String,integer> name = new Name<>();//将T规定为String类型,F为integer类型(谁使用泛型,泛型就是谁的数据类型)
注:1.这是在你知道你要给泛型什么数据类型时使用
2,如果你不知道你要给泛型什么数据类型时将T,F改为"?"来占位
如:
可以在方法中使用规定泛型形参的范围
public void fun(P<? extends(小于等于) Number,? super(大于等于) String> p){
System.out.println("(x:"+p.getX()+",y:"+p.getY()+")");
}
刚才的方法规定了两个泛型的类型范围
extends等价于<=(只能是自己或者子类) ,super等价于>=(只能是自己或父类)
使用:new Name().fun(new Name<Integer,String>("world",111));
fun方法执行的结果为"world111"
泛型的嵌套
泛型可以嵌套其他泛型的数据类型
如:
class Name1<T,V>{
private T var1;
private V var2;
}
class Name2<Z>{
private Z var1;
}
使用:Name2<String> name2 = new Name2<>();
Name1<name2 <String>,integer> name1= new Name1<>();
将Name2的String类型嵌套给Name1