java泛型与通配符
泛型
泛型:1.参数化类型,类似于方法的形式参数
2.在成员变量和成员方法,以及静态方法中使用泛型,表示类型不确定,当创建对象的时候要确定具体的类型
3.创建对象的时候省略不写表示Object类型
4.泛型不包含继承关系
5.泛型类的不同类型的对象的字节码对象是同一个,字节码对象中不包含泛型
代码
public class Test02 {
public static void main(String[] args) {
ArrayList<String> list1=new ArrayList<>();
ArrayList<Integer> list2=new ArrayList<>();
ArrayList list3=new ArrayList<>();
//创建对象时,类型省略 是ArrayList<Object>类型
System.out.println(list1.getClass()==list2.getClass());
//list1,list2字节码对象比较
//ArrayList<Object> list4=list1;
//错误
//泛型没有继承关系,
}
}
结果
泛型的好处:
1.避免了类型转换的麻烦,存储是什么类型,取出就是什么类型
2.把运行期异常提升到编译期
通配符
通配符?:代表任意的数据类型,String是Object的子类,ArrayList<String> 与 ArrayList<Object> 没有继承关系,故引入通配符
使用方式:1.大部分作为方法参数使用,还有局部变量,成员变量的类型
2.但是一旦使用泛型的通配符后,这个类型的操作被当做Object来对待,但不等同将该类定义为Object类
3.该类对于方法参数有泛型的方法,因该类类型不确定而很难被使用
代码
public class Test01 {
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
/* ArrayList<? extends Number > list3= list1;
通配符在此处限定了范围,要求是Number或是Number的子类
因此错误*/
ArrayList<? extends Number> list4 = list2;
list4.add(null);
// list4.add(5);
System.out.println(list4.get(0));
/*list4使用方法add,因ArrayList<? extends Number >类型不定,null刚好满足各种类型
list4.add(5)会报错*/
}
}
结果