public class ExampleGenerics { public static void main(String[] args) {
//java1.5以后写法 // 使用泛型集合 List<Integer> integerList = new ArrayList<>(); for (int i = 0;i < 10;i++){ integerList.add(i); } for (Integer integer:integerList){ System.out.println(integer); } //java1.5之前写法 //需要强转 List list = new ArrayList(); for (int i = 0;i < 10;i++){ list.add(i);b } for (Object o:list){ System.out.println((Integer)o); } } }
//反编译后 interface Comparable { public int compareTo( Object that); }
public final class NumericValue implements Comparable { public NumericValue(byte value) { this.value = value; } public byte getValue() { return value; } public int compareTo(NumericValue that) { return value - that.value; } public volatile int compareTo(Object obj) { return compareTo((NumericValue)obj); } private byte value; }
E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定的java类型(无限制通配符类型)
通配符和上下界
使用泛型类可以指定具体类型,也可以使用?通配符来表示未知类型。一般我们会使用上下界来限制通配符。
<? extends T>和<? super T>是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。 <? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”,即泛型中的类必须为当前类的子类或当前类。 <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”,即泛型中的类必须为当前类或者其父类。
1 2 3 4 5 6 7 8 9 10 11 12
public static void TestExtends(){ List<? extends Number> list = new ArrayList<>(); list.add(new Integer(1));//报错 Number number = list.get(0);//返回上界 }
public static void TestSuper(){ List<? super Number> list = new ArrayList<>(); list.add(new Integer(1)); list.add(new Object());//报错 Object o =list.get(0);//只能返回Object类型 }