List<String> strList = new ArrayList<>();
这个List集合只能保存字符串对象,不能保存其他类型的对象。
Java7开始,Java允许在构造器后不需要带完整的泛型类型。只要<>即可。
List<String> strList = new ArrayList<>();
Map<String , Integer scores = new HashMap<>();
泛型允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定。
public interface List<E>{ void add(E x); Iterator<E> iterator(); ... }
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的父类,并不能把元素加入到其中。