泛型就相当于集合的标签,我们在使用集合<>
的时候,就是在使用泛型
要知道的是在jdk1.5以前我们只能把集合中的元素设计为Object,之后引入了泛型的概念来解决,我们把元素的类型设计成一个参数,这个类型参数就叫做泛型。
我们假设没有泛型会出现哪种情况,Object类型,是不是啥都能存放?少了限制
package fanxing;import java.util.ArrayList;public class text01 {public static void main(String[] args) {ArrayList id = new ArrayList<>();id.add(1);id.add(2);id.add(3);id.add(4);id.add("ymm");//误存放for(Object obj : id){System.out.println(obj);}}
}
缺点:集合中可能出现不同类型的数据,不便于管理
添加泛型后:
package fanxing;import java.util.ArrayList;public class text01 {public static void main(String[] args) {ArrayList id = new ArrayList();id.add(1);//自动装箱了id.add(2);id.add(3);id.add(4);//id.add("ymm");会报错for(Object obj : id){System.out.println(obj);}for(Integer i : id){System.out.println(i);}}
}
优点:在编译初期就进行检查,不会出现后续的数据类型错误
就是将E给确定为Integer类型
泛型对应的数据类型:
都是引用数据类型,不能是基本数据类型,因为泛型本来就是给集合服务的,集合是引用数据类型,那么泛型自然也就是引用数据类型了,hh
简便写法:
ArrayList
id = new ArrayList<>();
对于初次接触泛型的小伙伴,可能有点懵,啥是泛型接口?
参考上面这个源码中的
这就是一个泛型接口,下面我们来手写一个泛型接口(学习这个东西,方便我们来看懂源码
public class Text1{}
public class Text2 {}
package fanxing;import java.util.ArrayList;public class text01 {public static void main(String[] args) {Text a = new Text();a.aa("jjjjj");}public static class Text {int a;int b;public void aa(E a){System.out.println(a);}}
}
我们可以说是,如果在实例化的时候不指定数据类型,默认为Object类型
来看如果我们在实例化的时候指定数据类型呢?
package fanxing;import java.util.ArrayList;public class text01 {public static void main(String[] args) {Text a = new Text();a.aa(1111);}public static class Text {int a;int b;public void aa(E w){System.out.println(w);}}
}
package fanxing;import java.util.ArrayList;public class text01 {public static void main(String[] args) {Text01 son = new Text01();son.aa(123);}public static class Text {public void aa(E a){System.out.println(a);}}public static class Text01 extends Text{}
}
指定父类中的泛型,子类中无需再指定泛型,可以直接继承自父类中指定好的泛型,那么既然有指定好的,那么我们来看一下没有指定好的泛型是什么情况?
hh,红色报错!
如果父类不明确指定泛型,那么子类也会变成一个泛型类,这个E的类型可以在创建子类对象的时候确定
这像不像ArrayList中的源码呢?
这里有一个比较容易混淆的概念,泛型方法。
这是不是一个泛型方法呢?不是!并不是带泛型就是泛型方法
泛型方法的参数类型无关于当前类的泛型,我们通过下面的代码来看一下!
public static class Text {//不是泛型方法public void aa(E a){System.out.println(a);}//是泛型方法public void W(W b){}}
假设当前的类就没泛型,那么我们第一种写法就是正确的
调用泛型方法
package fanxing;import java.util.ArrayList;public class text01 {public static void main(String[] args) {Text t= new Text();t.W("j");}public static class Text {//不是泛型方法public void aa(E a){System.out.println(a);}//是泛型方法public static void W(W b){//泛型方法可以是静态方法System.out.println("我是泛型方法");}}}
上一篇:我想要的是一个“有趣”的口碑
下一篇:输给下属的价值