泛型的作用从使用层面上来说是统一数据类型,防止将来的数据转换异常。从定义层面上来说,定义带泛型的类,方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确定的类型,代码更灵活。
不使用泛型,少了限制,则在集合添加数据就不会类型异常的错误,导致运行结果出错。
public class Test { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("1"); list.add(666); list.add(true); for (Object o : list) { String s = (String) o; System.out.println(s.length()); } } }
new对象的时候确定类型,格式:
public class 类名{ }
public class MyArrayList { Object[] obj = new Object[5];//定义一个数组,充当ArrayList底层的数组,长度直接规定为10 int size; public boolean add(E e){ //定义一个add方法,参数类型需要和泛型类型保持一致 obj[size] = e; size++; return true; } @Override public String toString() { return Arrays.toString(obj); } }
public class Test { public static void main(String[] args) { Student list1 = new Student<>(); list1.add("张三"); list1.add("李四"); System.out.println(list1);//直接输出对象名,默认调用toString Student list2 = new Student<>(); list2.add(1); list2.add(2); System.out.println(list2); } }
调用的时候确定类型,其格式:
修饰符 返回值类型 方法名(E e)
public class Student { public static void addAll(ArrayList list, E...e){ //定义一个静态方法addAll,添加多个集合的元素,传入可变参数 for (E element : e) { list.add(element); } } }
public class Test { public static void main(String[] args) { ArrayList list1 = new ArrayList<>(); Student.addAll(list1, "张三", "李四"); System.out.println(list1); ArrayList list2 = new ArrayList<>(); Student.addAll(list2, 1, 2); System.out.println(list2); } }
格式:
public interface 接口名{ }
什么时候确定类型分两种,一种是在实现类的时候还没有确定类型,只能在new实现类的时候确定类型了,例如ArrayList。一种是在实现类的时候直接确定类型了比如Scanner。
public interface MyList { public boolean add(E e); }
public class MyArrayList implements MyList{ Object[] obj = new Object[5]; int size; public boolean add(E e){ //定义一个add方法,参数类型需要和泛型类型保持一致 obj[size] = e; size++; return true; } @Override public String toString() { return Arrays.toString(obj); } }
public class Test { public static void main(String[] args) { MyArrayList list = new MyArrayList<>(); list.add("张三"); list.add("李四"); System.out.println(list); } }
泛型通配符使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。包括以下几类
E:Element (在集合中使用,因为集合中存放的是元素)
T:Type(Java 类)
K:Key(键)
V:Value(值)
N:Number(数值类型)
?:表示不确定的 java 类型
public class Test { public static void main(String[] args) { ArrayList list1 = new ArrayList<>(); list1.add("张三"); list1.add("李四"); ArrayList list2 = new ArrayList<>(); list2.add(1); list2.add(2); test(list1); test(list2); } public static void test(ArrayList list){ //?表示不确定的 java 类型 for (Object o : list) { System.out.println(o); } } }
泛型的上下限可以规定泛型的范围
上限:?只能接收extends后面的本类类型以及子类类型
格式:
下限:?只能接收super后面的本类类型以及父类类型
格式:
Integer的父类Number
Number的父类Object
上一篇:必备教程!微扑克wpk真的有辅助的,扑克之城软件透明挂,有挂攻略(2022已更新)(哔哩哔哩)
下一篇:Redis Desktop Manager的下载安装及使用,2024年最新Java程序员面试中最容易答错的8道面试题