泛型就是一种自定以声明变量的类型
也就是把类型变成一种参数进行传递
点击查看代码
public class a<T>{
public T X;
public a(T s){
this.X =s;
System.out.print(this.X);
}
public static void main(String[] args) {
a<String> obj = new a("kkkk");
}
}
///////////////////////////
public class a<T>{
public T X;
public a(T s){
this.X =s;
System.out.print(this.X);
}
public static void main(String[] args) {
a<Integer> obj = new a(111);
}
}
相当于我们把类也当做了自定义的参数
但需要注意的是在类里面定义的泛型方法的泛型变量是和泛型类毫无关系的,也就是说我们可以自定义泛型类里面的泛型方法
点击查看代码
public class a<T>{
public T X;
public a(T s){
this.X =s;
System.out.print(this.X);
}
public <T> void rr(T arg){ //这个泛型变量T就不再是泛型类的T了 他归属于这个泛型方法本身
System.out.println(arg.getClass());
}
public void aa(T name){
System.out.println(name.getClass());
}
public static void main(String[] args) {
a<Integer> haha = new a<>(111); //可以看到泛型类的T是Integer
haha.<String>rr("SDSDSDS"); //泛型方法的T是String
haha.aa(111);
}
}
限定泛型
限定接口
当我们泛型如果既要满足继承条件又要满足继承接口那么继承的类要先写前面然后再加上&连接接口类
约束条件
类型变量T不能被实例化
类型变量不能在静态域或静态方法中使用,但是静态方法本身就是泛型方法就可以
泛型实例化成对象后不能用instanceof
不论传入的类型变量是啥,所有泛型类实例出来的对象getClass都相同
还有两个比较偏就不写了
泛型的继承
就算类型变量T具有继承关系,我们的泛型类之间也毫无关系
例如orange继承了fruit类但是
以他们两位类型变量的泛型类是毫无干系的
如下
print(b)会报错
通配符
为了解决上述问题就引入了通配符的概念
? extends Fruit 就规定了我们的类型变量的上限就是Fruit类只能传入这个类本身或者他的子类
这样print(b)就没问题了
? super Apple 的意思是要传入的类型得是Apple或者他的父类