java集合有个缺点——将一个对象放进集合之后,该对象的编译类型就会变成Object类型(其运行时类型不变)编译时不检查对象的类型。
泛型概念:java的参数化类型,即在创建集合时指定集合元素的类型。
如,List<String> strList=new ArrayList<String>(); 后面的String可省略不写
strList.add(5); 会引起编译错误,因为已经指定strList 集合存放的数据类型为String类型了,不能存放其他类型的对象。输出时不用强制类型转换。
泛型实质:允许在定义接口、类和方法时使用类型形参,类型形参将在声明变量、创建对象和调用方法时动态的指定。
1 public class Apple<T> { 2 private T info; 3 public Apple(){ 4 } // 构造器名依然为Apple,而不是Apple<T> 5 public Apple(T info){ 6 this.info=info; 7 } 8 9 public static void main(String[] args) { 10 Apple<String> a1=new Apple<>("苹果"); 11 System.out.println(a1.info); 12 Apple<Double> a2=new Apple<>(23.56); 13 System.out.println(a2.info); 14 } 15 16 }
从泛型类派生子类
可以从带泛型声明的接口、类中创建其实现类或继承类,此时使用这些接口或类时不能包含类型形参
public class A extends Apple<T>{} 此处为错误写法
public class A extends Apple<String>{} 此处为正确写法
public class A extends Apple 使用类或接口时也可以不形参传入实参
调用方法是必须为所有的数据形参出入参数值。
不能在静态方法、静态变量和静态代码块的声明和初始化中使用类型参数。
public class B<T> { static T t1; public static void study(T t1){ } }