泛型
使用泛型
List<String> strList = new ArrayList<>();
这个List集合只能保存字符串对象,不能保存其他类型的对象。
菱形语法
Java7开始,Java允许在构造器后不需要带完整的泛型类型。只要<>即可。List<String> strList = new ArrayList<>();
Map<String , Integer scores = new HashMap<>();
深入泛型
泛型允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定。
List接口代码片段
public interface List<E>{
void add(E x);
Iterator<E> iterator();
...
}
实例:使用泛型声明的Apple类
public class Apple<T>{
private T info;
public Apple(){}
public Apple(T info){
this.info = info;
}
public void setInfo(T info){
this.info = info;
}
public T getInfo(){
return this.info;
}
public static void main(String[] args){
Apple<String> a1 = new Apple<>("苹果");
System.out.println(a1.getInfo());
Apple<Double> 2 = new Apple<>(5.67);
System.out.println(2.getInfo());
}
}
重写父类方法
public class A2 extends Apple{
public String getInfo(){
return super.getInfo().toString();
}
}
泛型类的关系
List<String> l1 = new ArrayList<>();
List<String> l2 = new ArrayList<>();
System.out.println(l1.getClass() == l2.getClass());//true
1.不管泛型的实际参数是什么,它们在运行时总有相同的类。
2.不管为泛型的类型形参传入哪一种类型实参,对于Java来说,它们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。如static T info
3.由于系统中并不会真正生成泛型类,所以instanceof
运算符后不能使用泛型类,例如if (cs instanceof List<String>) {...}
注意:
数组和泛型有所不同,假设Foo是Bar的一个子类型(子类或者子接口),那么Foo[]依然是Bar[]的子类型;但G
泛型高级用法
限制泛型类型
class ClassName<T extendes anyClass>
使用类型通配符
List<?>
它的元素可以匹配任何类型。
这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素加入到其中。