在集合中不使用泛型,默认的类型就是Object。容易引发异常
ArrayList list = new ArrayList();
list.add("jws");
list.add(521);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
String s = (String) next;
System.out.println(s.length());
}
输出异常 ClassCastException
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String使用泛型
将运行期异常,提升到编译期异常。
ArrayList含有泛型的类(创建对象的时候会确定具体的数据类型)list = new ArrayList(); list.add("jws"); list.add(521);//这时再编译的时候爆红 Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); String s = (String) next; System.out.println(s.length()); }
创建实体
//可以接收任意数据类型的实体类 public class Generic{ private T name; private T age; }
创建实体对象时确定数据类型
Generic含有泛型的方法(普通方法和静态方法)(调用方法时确定数据类型)generic = new Generic(); generic.setName(521);
//创建含有泛型的方法
public class GenericMethod{
//普通方法
public void method01(T t){
System.out.println("含泛型的普通方法"+t);
}
//静态方法
public static void method02(T t){
System.out.println("含泛型的静态方法"+t);
}
//使用方法
//使用普通方法
GenericMethod genericMethod = new GenericMethod();//创建方法对象
genericMethod.method(521);//确定方法的类型为Inter
genericMethod.method("jws");//确定方法的类型为Sting
//使用静态方法
//静态方法可以通过类型.方法名直接使用。不必创建对象使用
GenericMethod.method(521);//确定方法的类型为Inter
含有泛型的接口(实现类确定数据类型、创建对象时确定数据类型)
//定义含有泛型的接口
public interface GenericInterface{ public abstract void method(T t); }
第一种实现:实现类确定数据类型
public class GenericInterfaceImpl1 implements GenericInterface{//实现接口的String类型 @Override public void method(String s) { } }
第二种实现:创建对象时确定数据类型
public class GenericInterfaceImpl2泛型通配符(不能创建对象使用,只能作为方法的参数使用)implements GenericInterface { @Override public void method(T t) { GenericInterfaceImpl2 g2 = new GenericInterfaceImpl2<>();//创建对象时确定数据类型 } }
不知道使用什么类型的时候,此时使用问号(?)表示任意数据类型,此时只能接收数据,不能往集合中存数据。
public class Demo {
//不能创建对象使用,只能作为方法的参数使用
public static void main(String[] args) {
ArrayList list01 =new ArrayList<>();
list01.add(1);
list01.add(2);
ArrayList list02 =new ArrayList<>();//不能创建对象使用问号
list02.add("a");
list02.add("b");
method(list01);//接收任意类型数据
method(list02);
}
//定义一个方法,不知道什么类型的集合,用?来接收数据类型
public static void method(ArrayList> list){//只能作为方法的参数使用
Iterator> iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
}
受限泛型,限定使用的数据类型(上限限定和下线限定)
主要在源码上,实际应用很少
1、 extends Number>上限限定,传参的类型只能是Number及其子类
2、 super Number>下线限定,传参的类型只能是Number及其父类
public static void getElement1(Collection extends Number> collection) {//上限限定,传参的类型只能是Number及其子类
}
public static void getElement2(Collection super Number> collection) {//下线限定,传参的类型只能是Number及其父类
}



