1.Object类:
java.lang包在使用的时候无需显示导入,编译时由编译器自动导入。
Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类。
Object类是Java中唯一没有父类的类。
其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法。
2.Object运用:
如果你方法参数存在object,那么就意味这你的参数范围很广,同时也会使你的方法变的更加灵活,因为object是所有类的父类.例如:
public List getListO(Object ob){
List list = new ArrayList<>();
list.add(ob);
return list;
}
这样当你调用该方法的时候传什么参数都可以,
优点:使代码变得更通用
缺点:往往需要转型,效率低,容易产生错误
(向上选转型是没有风险的, 但是在向下转型的时候就存在风险,如果转型失败就会抛出异常ClassCastException),例如:
public void test(){
String str=“asd”;
List list = getListO(str);
Object ob = list.get(0);
//如果此时Integer i=(Integer)list.get(0);就会抛异常.原因是我在list集合中添加的是String类型的数据
String st = (String) list.get(0);
}
3.泛型的解释:
Java泛型编程是JDK1.5版本后引入的。泛型让编程人员能够使用类型抽象,通常用于集合里面。
泛型的本质便是类型的参数化,通俗的说就是用一个变量来表示类型,这个类型是不确定,但是仅仅是表示某个类型
3.1定义泛型类如下:
classTest{
private T t;
Test(T t){
this.t=t;
}
public T getT(){
return t;
}
public void setT(T t){
this.t=t;
}
}
3.2定义泛型方法如下:
public List getlistT(T t){
List list = new ArrayList<>();
list.add(t);
return list;
}
*泛型参数类型声明必须在返回类型之前
public void test() {
String str = “1111”;
List getlistT = getlistT(str);
String string = getlistT.get(0);
}
在编译的时候就已经的确定类型,所以不需要强转,不存在转型风险
3.3 误区
3.3.1不能创建参数化类型的数组
3.3.2不能实例化类型变量,及不能出现以下的类似代码
T t= new T();或者 T.class
3.3.4不能再静态域或方法中出现参数类型
private static T t;
public static void test(){
action about T…
}
3.4优点:
3.4.1.泛型可以把使用Object的错误提前到编译后,而不是运行后,提升安全性
3.4.2.增强程序可读性,稳定性和效率
3.5 类型擦除的由来
在JAVA的虚拟机中并不存在泛型,泛型只是为了完善java体系,增加程序员编程的便捷性以及安全性而创建的一种机制,在JAVA虚拟机中对应泛型的都是确定的类型,在编写泛型代码后,java虚拟中会把这些泛型参数类型都擦除,用相应的确定类型来代替,代替的这一动作叫做类型擦除,而用于替代的类型称为原始类型,在类型擦除过程中,一般使用第一个限定的类型来替换,若无限定则使用Object.
3.6.泛型限定
泛型限定是通过?(通配符)来实现的,表示可以接受任意类型,那一定有人有疑问,那?和T(二者单独使用时)有啥区别了,其实区别也不是很大,仅仅在对参数类型的使用上。
public void printDif(ArrayList<?> al){
Iterator<?> it = al.iterator();
while(it.hasNext(){
Object ob = it.next();
System.out.println(it.next());
}
}
public void printDifT(ArrayList al){
Iterator it = al.iterator();
while(it.hasNext()){
T t = it.next();
System.out.println(t);
}
}
//区别就在此处,T可以作为类型来使用,而?仅能作为接收任意类型(Object)
*jdk 1.5/1.6 必须显式的写出泛型的类型。
*jdk 1.7/1.8 不必显式的写出泛型的类型。
4.通配符?
通配符是一个有趣的东西,如果你掌握了,会使你的代码更为通用(健壮性更强)。
4.1 通配符的几种形式:
4.1.1无限定通配符,<?>。
4.1.2上限通配符,<? extends test>。表示参数类型只能是Number的子类。
4.1.3下限通配符,<? super test>。表示参数类型只能是Number的父类。
?如果使用extends,super就能将范围缩小 ,使用泛型、通配符提高了代码的复用性。
上面已经定义了一个?方法了,就不在举例 了,很多东西其实还的靠自己去思考的
5.区别
5.1 ?和object相似,但具体说,?会比object更细致化一些.
5.2在定义泛型对象的使用方法时,还不知道T是什么类型,它可能是String类型,也可能是Integer类型。
如果,把T定义成一个确定的泛型数据类型,参数就只能是这种数据类型。此时,就用到了通配符代替确定的泛型数据类型。
5.3 把一个对象分为声明、使用两部分的话。泛型侧重于类型的声明上代码复用,通配符则侧重于使用上的代码复用。
泛型用于定义内部数据类型的不确定性,通配符则用于定义使用的对象类型不确定性。
原文链接:https://blog.youkuaiyun.com/j_cxn/article/details/78581943