java 泛型
1 泛型的概念
泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
2使用泛型的好处
- 避免了类型转换的麻烦,存储的是什么类型取出的就是什么类型;
- 把运行期(代码运行之后出现异常)异常提升为编译期(写代码的时候会报错)异常
3泛型的使用
1 泛型类与泛型方法
public class A { // 泛型类:定义类的时候指定类型形参T,在类里面T就可以当成类型使用
private T a;
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
}
继承的几种方法:
class B1 extends A {}
class B2 extends A {}
class B3 extends A {}
class B4<E1, E2> extends A {}
使用:
public static void main(String[] args) {
A a1 = new B1();
a1.setA(“a1”);
System.out.println(a1.getA());
B2 b2 = new B2<>();//菱形语法
b2.setA(“b2”);
System.out.println(b2.getA());
}
2 泛型接口和泛型方法
在泛型接口中,如下的生成器接口定义:
public interface Generator {
public T next();
}
然后定义一个生成器类来实现这个接口:
public class FruitGenerator implements Generator {
private String[] fruits = new String[]{"Apple", "Banana", "Pear"};
@Override
public String next() {
Random rand = new Random();
return fruits[rand.nextInt(3)];
}
}
调用:
public class Main {
public static void main(String[] args) {
FruitGenerator generator = new FruitGenerator();
System.out.println(generator.next());
System.out.println(generator.next());
}
}
4 泛型通配符
常用的 T,E,K,V,?
?无界通配符
上界通配符 < ? extends E>
下界通配符 < ? super E>
T 和 ? 区别
泛型和通配符最根本的区别就是Java编译器会把泛型【T】推断成具体类型,而把通配符【?】推断成未知类型。Java编辑器只能操作具体类型,不能操作未知类型,如果有对参数做修改的操作就必须要使用泛型,如果仅仅是查看就可以使用通配符