Java新特性-泛型

在这里插入图片描述
1.JDK1.5新特性

1.1可变参数
问:要求方法可以接收任意个整数并且返回它们的相加结果。
要求:一个方法只允许有一个可变参数,并且只允许写在最后。
语法:类型…参数名称。
可变参数的本质还是数组。
1.2for-each循环
for(数据类型 临时变量 : 数组名称){} 用于数组与类集的简单输出。
1.3静态导入:
不同包中,在a包中调用b包的类中的静态属性,可以在b包中用static导入a包,此时调用a的方法不用加类名。
包导入:ctrl+alt+bachspace

2.泛型
2.1泛型类
泛型指的就是在类定义的时候并不会设置类中的属性或方法中的参数的具体类型,而是在类使用时再定义。
语法:

class MyClass{
T value1;
}

在这里插入图片描述
T被称为类型参数,用于指代任何类型。
T:代表一般的类
E:代码element,常用于泛型中的属性。
K,V:键指对,见MAP集合。
在这里插入图片描述
泛型只允许接收类,所以基本类型必须使用包装类
2.2泛型方法
public void MyMethod(T t){
Sysout(t);
}
在这里插入图片描述
T:类型参数,表示本方法是一个泛型方法。
当泛型类与泛型方法共存时,泛型类中的类型参数与泛型方法中的类型参数没有关系,泛型方法始终以自己定义的类型参数为准。
规范:泛型方法类型参数与泛型类的类型参数也不要同名。
在这里插入图片描述
在这里插入图片描述
如果这个程序报错,那句说明泛型类的T和泛型方法的T是一样的意义,但是程序运行通过并且结果正确,所以俩个T是不同的。规范中建议将俩种T定义为不同的名字。
2.3.通配符
2.3.1<?>—可以接受任意类型
只能用于方法中,表示可以接受任意类型的泛型类。只能取得数据,不可以设置(修改)数据,因为类型不确定,无法设置确定类型。
Myclass <?> myclass
2.3.2 ? extend 类 :设置/取得泛型上限。
上限:本类及子类。相当于天花板。
eg:<? extends Number> :表示泛型必须是Number及其子类。
用在类上 T extends 类 :表示T必须是类或者类的子类。
用在方法上 ? extends 类 : 只能接受类或者麒子类的泛型类。只能取得不可以修改。(发生父类到子类的向下转型,需要强转,由于具体子类不确定,因此无法转型)。
只有extends能用在泛型类上。
2.3.3 ? super 类 :取得泛型下限–只能用在方法上。
eg: ? super String : 表示此方法只能取得String及其父类Object。
只有泛型下限可以设置属性值,因为子类到父类是自动的向上转型。

2.4泛型接口
在接口后面加。
子类在实现接口时:
Ⅰ.子类继续保持泛型。
Ⅱ.子类定义为普通类,定义时确定类型。

interface IInterface{
T test(T t);
}
//1.自雷继续保留泛型
class InterfaceImpl implments IInterface{}
//2.子类定义时确定好类型
class InterfaceImpl implments IInterface{}

2.5类型擦除(语法糖) 语法糖(方便程序员开发):仅存在于源码阶段,编译后就消息不见。 eg:泛型,自动拆装箱。 泛型信息仅存在于代码的源码(编译)阶段,进入JVM之前,与反向相关的信息会被擦除掉。擦成Object。 专业术语:类型擦除。 换句话说,泛型类与普通类在JAVA虚拟机内没有任何区别。 泛型类进入JVM之前会进行擦除,之前泛型类的类型参数若没有指定上限,会被擦除为Object类型。如果指定上限,则类型参数会被替换为相应类型上限。