为什么使用泛型?
Java编译器在编译时加强泛型代码的类型检查,避免运行时不可预料的错误。
泛型支持程序化类型作为参数,使方法兼具灵活性。
泛型能让你实现泛型算法,更具有通用性。
泛型类型和方法
泛型类型
参数化类型的类或接口。
格式:classname<T1,T2,...,Tn>{},其中T1,T2称为typeparameters。
调用泛型类型(又称为参数化类型):Box<Integer>integerBox,传入具体的类型。
实例化泛型类型:Box<Integer>integerBox=newBox<Integer>();
泛型方法
参数化类型的方法。
格式:publicstatic<K,V>booleancompare(Pair<K,V>p1,Pair<K,V>p2),static,non-static均可。
调用泛型方法:Util.<Integer,String>compare(p1,p2)。可以利用类型推断,像调用普通方法一样调用泛型方法,如:Util.compare(p1,p2)
通过extends来限定泛型类型和方法的边界
通配符和子类型
Integer是Number的子类,但参数化类型Box<Integer>和Box<Number>没有关系,他们的共同父类是Object。
泛型类型之间几乎没有关系,但可以通过通配符在泛型类型之间建立关系。
?通配符,用于参数、字段、局部变量的类型,不用于泛型类型和方法。
上界:List<?extendsNumber>,不确定类型是指定类型或指定类型的子类,可以放松对变量的限制,如匹配List<Number>,List<Integer>。例如,List<Number>仅匹配Number类型的List,而List<?extendsNumber>匹配Number类型和其子类的List。
无界:List<?>,不确定类型的List。使用场景:1)List的元素都是Object类型,直接可以使用Object的方法。2)泛型类中的方法不依赖于类型参数。
下界:List<?superInteger>,不确定类型是指定类型或指定类型的父类,可以尽量提高灵活性,如匹配List<Integer>,List<Number>,List<Object>。
通配符使用的场景
把参数变量看作两类:
1、『in』提供给方法内部使用,即传入数据。
2、『out』提供给方法外部使用,即传出数据。
利用WildcardCapture特性,通配符使用的场景为:
1、『in』使用上界通配符
2、『out』使用下界通配符
3、『in』可以使用Object的方法,使用无界通配符
4、即用作『in』,又用作『out』的,不使用通配符
泛型的限制
不能用primitive类型实例化泛型。如:Pair<int,char>p=newPair<>(8,'a');
不能实例化参数类型。如:newE();
不能定义类的静态类型字段是参数类型。如:privatestaticTos;
参数类型不能使用instanceof和类型转换。如:listinstanceofArrayList<Integer>
不能创建参数化类型数组。如:List<Integer>[]arrayOfLists=newList<Integer>[2];
不能Create,Catch,或者Throw参数化类型对象。如:classMathException<T>extendsException{}
重载方法不能使用参数化类型被擦除后拥有同样的原生类型。如:
publicvoidprint(Set<String>strSet){}
publicvoidprint(Set<Integer>intSet){}
被编译擦除后是一样的publicvoidprint(SetstrSet){}
以上就是长沙达内教育java培训机构小编介绍的“2019年Java泛型用法总结”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
相关内容
java泛型方法的使用
完整的Java软件开发学习路线
Java泛型定义与java用法泛型实例详解