把一个对象放进集合中之后,集合就会忘记这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成Object类型了
为了解决上面的问题,就引出了泛型这一个概念
public class Fruit<T> {
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<String> lt = new Fruit<String>("苹果");
System.out.println(lt.getInfo());
Fruit<Integer> intg = new Fruit<Integer>(1);
System.out.println(intg.getInfo());
}
}
可以灵活的封装,并且同时有可以限定类型,泛型的接口和类更像是一种通用的模型,模型内部的类型由使用者自己限定
无论为泛型的类型形参传入哪一种类型的实参,对于Java来说,他们依然被当成同一个类处理,在内存中也只占用一块内存空间, 因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参
public class Apple extends Fruit<String>{
public Apple(String info) {
super(info);
}
@Override
public String getInfo() {
return super.getInfo();
}
}
public class Fruit<T extends String & java.io.Serializable> {
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<String> lt = new Fruit<>("苹果");
System.out.println(lt.getInfo());
Fruit<?> intg = new Fruit<>("1");
System.out.println(intg.getInfo());
}
}
public class Fruit<T> {
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<String> lt = new Fruit<>("苹果");
System.out.println(lt.getInfo());
Fruit<?> intg = new Fruit<>(1);
System.out.println(intg.getInfo());
}
}
Fruit<? extends String> intg = new Fruit<>("1");
static <T,B> void getCollection(Fruit<? super T>b){
System.out.println(b);
}
修饰符<T,S>返回值类型 方法名(形参列表){
方法体
}
static <T,B> void getCollection(B[]b,Collection<T> c){
}
public class Fruit<T extends String & java.io.Serializable> {
private T info;
public Fruit(T info) {
this.info = info;
}
static <T,B> 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 <T> Fruit(T info) {
System.out.println(info);
}
擦除
当把一个具有泛型信息的对象赋值给另一个没有泛型信息的变量时,尖括号中的泛型信息就会被擦除扔掉
转换
当把一个没有泛型信息的对象赋值给另一个泛型信息的变量时,不会发生报错,会自动转换