Java的泛型
一、泛型是什么?
泛型就是用来规定一个类、接口或方法的时候接收的数据的类型. 就像在声明方法时指定参数一样, 我们在声明一个类, 接口或方法时, 也可以指定其"类型参数", 也就是泛型。
二、使用泛型的好处?
- 提高安全性:将运行期的错误转换到编译期. 如果我们在对一个对象所赋的值不符合其泛型的规定, 就会编译报错.
- 避免强转: 比如我们在使用List时, 如果我们不使用泛型, 当从List中取出元素时, 其类型会是默认的Object, 我们必须将其向下转型为String才能使用。比如:
List l = new ArrayList(); l.add("abc"); String s = (String) l.get(0);
如果使用泛型,就可以保证存入和取出的都是String类型, 不必在进行cast了。比如:
List<String> l = new ArrayList<>(); l.add("abc"); String s = l.get(0);
三、泛型的使用场景
1,使用在类中.或者接口中,
//Test<T> 中的T就是我们的泛型作用在类中,生命我们的参数类型为T public class Test<T> { private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } } //作用在接口上,用来声明返回自类型 public Interface Test<T> { T selectAll(); T addUser(); }
- 重点说明:
- 变量类型中的泛型,和实例类型中的泛型,必须保证相同(不支持继承关系)。
- 既然有了这个规定, 因此在JDK1.7时就推出了一个新特性叫菱形泛型(The Diamond), 就是说后面的泛型可以省略直接写成<>, 反正前后一致。
- 说明:
- 泛型的声明,必须在方法的修饰符(public,static,final,abstract等)之后,返回值声明之前。
- 方法参数列表,以及方法体中用到的所有泛型变量,都必须声明。
2. 分类:
- 无边界通配符(<?>):
无边界的通配符的主要作用就是让泛型能够接受未知类型的数据。 - 固定上边界通配符(<? extends E>):
使用固定上边界的通配符的泛型, 就能够接受指定类及其子类类型的数据。
要声明使用该类通配符, 采用<? extends E>的形式, 这里的E就是该泛型的上边界. 注意: 这里虽然用的是extends关键字, 却不仅限于继承了父类E的子类, 也可以代指显现了接口E的类. - 固定下边界通配符(<? super E>):
使用固定下边界的通配符的泛型, 就能够接受指定类及其父类类型的数据。
要声明使用该类通配符, 采用<? super E>的形式, 这里的E就是该泛型的下边界.
注意: 你可以为一个泛型指定上边界或下边界, 但是不能同时指定上下边界。
3、静态方法与泛型
静态方法有一种情况需要注意一下,那就是在类中的静态方法使用泛型:静态方法无法访问类上定义的泛型;如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。
即:如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。
public class StaticGenerator<T> { .... .... /** * 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明(将这个方法定义成泛型方法) * 即使静态方法要使用泛型类中已经声明过的泛型也不可以。 * 如:public static void show(T t){..},此时编译器会提示错误信息: "StaticGenerator cannot be refrenced from static context" */ public static <T> void show(T t){ } }

浙公网安备 33010602011771号