泛型
泛型可以理解成一种标识,形如< T >,它可以标识在类名称之后,属性名之前,方法名之前。
标识在类名之后:
class <T> Person
标识在属性之前:private T name;
标识在方法之前:public <T> T getName()
这里可以发现,属性和方法中的数据类型没有出现,泛型代替了它
泛型创建之后如何使用
public class <T>Person{
private String name;
private T ID;
public <S> S fun(){
......
}
}
Person类已经创建,在主方法中创建Person类对象如下
Person<String> person = new Person<String>();
注意:这里的String不是类中所有对象使用String,只是Person类的一个叫person的对象使用String类型。
泛型的安全问题-泛型通配符
public class Demo1{
public static void main(String[] args){
Person<String> person1 = new Person<String>();
person1.setName = "入云龙";
Person<Integer> person2 = new Person<Integer>();
peron2.setName = 23;
fun(person1);
}
public void fun(Person person) {
person.setName = 11;
System.out.println(peron);
}
}
在主方法中调用fun方法,传入参数person1,由于fun方法中参数的数据类型没有确定,所以这时候能把person1的Name属性修改成功,泛型通配符可以解决这个安全问题并且不增加耦合,fun方法修改如下
public class Demo1{
public static void main(String[] args){
Person<String> person1 = new Person<String>();
person1.setName = "入云龙";
Person<Integer> person2 = new Person<Integer>();
peron2.setName = 23;
fun(person1);
}
public void fun(Person<?> person) {
System.out.println(peron);
}
}
<?>表示你传入的数据是什么数据类型,我便按什么数据类型处理。
泛型的引用传递–界限问题
如上文所讲,<?>可以接受任意数据类型,有的人就受不了,我要如何才能使它不能接收数值型呢?这就牵扯到了界限问题。
<? extends …> 限定上限,<? super …>限定下限
<? extends Number> 表示他只能接收Number数值型的子类,也就是说所有数值型Integer,Long......以外的数据类型都不能使用。<? super String>限定下限,规定只能接收String及它的父类。