public class Fruit {private T info;public Fruit(T info) {this.info = info;}public T getInfo() {return info;}public void setInfo(T info) {this.info = info;}public static void main(String[] args) {Fruit lt = new Fruit("苹果");System.out.println(lt.getInfo());Fruit intg = new Fruit(1);System.out.println(intg.getInfo());}
}
可以灵活的封装,并且同时有可以限定类型,泛型的接口和类更像是一种通用的模型,模型内部的类型由使用者自己限定
无论为泛型的类型形参传入哪一种类型的实参,对于Java来说,他们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。
public class Apple extends Fruit{public Apple(String info) {super(info);}@Overridepublic String getInfo() {return super.getInfo();}}
使用泛型接口或类的时候,虽然可以不加<>部分,但是推荐加上,不然还要强制类型转换等麻烦操作
重写父类方法或者实现接口的时候,返回值一定要跟父类(接口)一致。
public class Fruit {private T info;public Fruit(T info) {this.info = info;}public T getInfo() {return info;}public void setInfo(T info) {this.info = info;}public static void main(String[] args) {Fruit lt = new Fruit<>("苹果");System.out.println(lt.getInfo());Fruit> intg = new Fruit<>("1");System.out.println(intg.getInfo());}
}
可以有多个限定条件,存在多个限定条件的时候,使用&连接
至多一个父类上限,多个接口上限
接口上限要在类上线后面
使用类型通配符的类是各种该类的泛型的父类
public class Fruit {private T info;public Fruit(T info) {this.info = info;}public T getInfo() {return info;}public void setInfo(T info) {this.info = info;}public static void main(String[] args) {Fruit lt = new Fruit<>("苹果");System.out.println(lt.getInfo());Fruit> intg = new Fruit<>(1);System.out.println(intg.getInfo());}
}
在Java 7以后可以使用菱形语法,在构造器后不需要完整的泛型信息
"?"用于操作具体的某个泛型类的时候,还未确定最终使用时,采用的对象类型,就用问号作为占位的含义
Fruit extends String> intg = new Fruit<>("1");
使用extends的方式限定?必须是String类型或者是其子类类型
static void getCollection(Fruit super T>b){System.out.println(b);}
一定要是T或者T的父类
public class Fruit {private T info;public Fruit(T info) {this.info = info;}static void getCollection(B[]b){System.out.println(b);}public T getInfo() {return info;}public void setInfo(T info) {this.info = info;}public static void main(String[] args) {Fruit.getCollection(new String[]{"1"});}
}
存在泛型构造器,不能使用”菱形“语法
public class Fruit {public Fruit(O info) {//this.info = info;}
}//这样会报错
Fruit fruit = new Fruit("");
参考:https://segmentfault.com/a/1190000005339802