第15章 泛型

  • 无论何时,只要你能做到,就尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法。
  • 对于一个static方法,无法访问泛型类的类型参数,所以如果static方法需要具有泛型能力,就必须使其成为泛型方法。
  • 要定义泛型方法只要将泛型参数列表置于返回值之前:public <T> void f(T x);就可以了。
  • 当使用泛型类时,必须在创建对象的时候指定类型参数的值,而是用泛型方法的时候,通常不必指明参数类型,因为编译器会为我们找出具体的类型。这称为:泛型推断(type argument inference)。
  • 在使用泛型方法的时候也可以显示的指明类型:Tester.<Person>f();
  • 可变参数与泛型方法可以共存:public <T> void f(T... x);
  • 泛型还可以用于内部类和匿名内部类。
  • 惊讶?在泛型代码内部,无法获得任何有关泛型参数类型的信息:new ArrayList<String>().getClass() == new ArrayList<Integer>().getClass():
  • 上面:List<String>和List<Integer>在运行时具有相同的类型。在使用泛型时,任何具体的类型信息都被擦除了。
  • 为什么需要类型擦除?因为类库要向前兼容。Java1.5中带泛型客户端必须可以使用Java1.4中不带泛型的类库……同样要使不具有泛型的Java1.4的不具有泛型的客户端可以使用Java1.5的带有泛型的类库…… 变态:)
  • 在泛型中:instanceOf已经不能使用,但你可以使用T.isInstance()方法。
  • 不能创建泛型数组,基本上用ArrayList<>代替。
  • class Test<T extends Person> 与 class Test<? extends Person>的区别在于,前者可以接受任何Person或者Person子类类型的混合,而后者只能是某种具体的类。
  • 上边界:Vector<? extends Type1> = new Vector<Type2>(); Type2只能是Type1或者Type1的子类。
  • 下边界:Vector<? super Type1> = new Vector<Type2>(); Type2只能是Type1或者Type1的父类。
  • Vector<Object>与Vector<String>之间不存在继承关系(这一点与C++相同),但Vector<String>是Vector<?>的子类。//?????
  • 任何基本类型都不能作为类型参数
  • 一个类不能实现同一个泛型接口的两种变体,由于擦除的原因,这两个变体会成为相同的接口。

posted on 2013-05-04 00:03  peter9606  阅读(180)  评论(0编辑  收藏  举报

导航