本文共 3288 字,大约阅读时间需要 10 分钟。
【1】泛型的基本简介
泛型是JDK1.5的特性。
在JDK1.7之后可以省略“=”右边泛型的具体类型
泛型使用’<大写字母>‘表示。
泛型可以用在类、接口、方法上
【2】泛型的特点
泛型可以将错误提前:由运行阶段提前到编译阶段。
【3】泛型在源码中的表示
<E> :elements 元素
<T> : type 类型 <R> : result 结果 <K> : key 键 <V> : value 值【1】泛型在接口和实现类中都没有实现
接口使用泛型就是在接口后面跟上<大写字母>
接口的实现类如果没有实现泛型,那么在实现类后面也要跟上<大写字母>
如果实现类中没有实现泛型,那么需要在创建对象时调用
public class GenericityDemo { public static void main(String[] args) {//创建对象时,指明泛型类型 GenerImplgen = new GenerImpl<>(); }}interface Gener { T method();}class GenerImpl implements Gener { @Override public T method() { return null; }}
【2】泛型在接口中没有确定,在接口的实现类中确定
接口的实现类如果确定了泛型,那么在创建对象时就没有必要确定泛型。
public class GenericityDemo2 { public static void main(String[] args) { GenerImpl2 gen = new GenerImpl2(); }}interface Gener2{ T method();}class GenerImpl2 implements Gener2 { @Override public String method() { return null; }}
当我指明泛型类型后,创建对象就不需要实现泛型了。
在定义类时,在类名后加上<大写字母>
泛型擦除:就是决定泛型的具体类型
如果泛型有多个,在<>中用‘,’隔开
public class GenericityDemo3 { public static void main(String[] args) { GenerDemo3demo = new GenerDemo3<>(1,"李四"); System.out.println(demo.getName()); System.out.println(demo.getNum()); System.out.println(demo); }}class GenerDemo3 { private K num; private V name; public GenerDemo3(K num, V name) { this.num = num; this.name = name; } public K getNum() { return num; } public V getName() { return name; } @Override public String toString() { return "GenerDemo3 [num=" + num + ", name=" + name + "]"; }}
在方法的返回值类型前<大写字母>。在调用方法时确定泛型的类型。
public static void main(String[] args) { String str = "hello,world"; String str1 = method(str); System.out.println(str1); } public staticV method(V v){ return v; }
在方法返回值之前加上"<大写字母>"
【1】泛型的下限: <? super 类或者接口>
表示传入的泛型最小范围是super后面的类/接口
传入的泛型如果是类/接口的父类/父接口即可。
public class GenericityDemo3 { public static void main(String[] args) { Object obj = "1001"; String str = "小明"; GenerDemo3 g3 = method(new GenerDemo3(obj,str)); System.out.println(g3); } public static GenerDemo3 method(GenerDemo3 value){ return value; }}class GenerDemo3{ private K num; private V name; public GenerDemo3(K num, V name) { this.num = num; this.name = name; } public K getNum() { return num; } public V getName() { return name; } @Override public String toString() { return "GenerDemo3 [num=" + num + ", name=" + name + "]"; }}
分析:在上面的方法中,我设置了String为下限。向GenerDemo3的构造方法中传入Object对象与String对象,返回GenerDemo3的一个对象值。
【2】泛型的上限: <? extends 类或者接口>
表示传入的泛型最大的范围是extends后面的类/接口
传入的泛型如果是类/接口的子类/子接口即可。
public class GenericityDemo4 { public static void main(String[] args) { Object obj = new Object(); String str = "小明"; GenerDemo4 g3 = new GenerDemo4<>(obj,str); g3 = method(g3); System.out.println(g3); } public static GenerDemo4 method(GenerDemo4 value){ return value; }}class GenerDemo4{ private K num; private V name; public GenerDemo4(K num, V name) { this.num = num; this.name = name; } public K getNum() { return num; } public V getName() { return name; } @Override public String toString() { return "GenerDemo4 [num=" + num + ", name=" + name + "]"; }}
注意:泛型上限和下限不要同时存在一个<>中,因为Java中的类,是树状结构,一个类的父类子类,都在一条枝丫上。如果我们任意指定子类与父类,容易导致结构混乱。
转载地址:http://pddlf.baihongyu.com/