笔记——Java泛型
泛型
泛型是解决“数据类型与算法在编译是绑定”这一问题的有效方法之一。泛型最大的价值在于:在保证类型安全的前提下,把算法与数据类型解耦。
3.2泛型类
泛型类是指该类使用的参数类型作用于整个类,即在类的内部任何地方(不包括静态代码区域)都可把参数类型当做一个真实类型来使用。
public class Person<T>{ private T t; public Person(T t){ this.t = t; } public String toString(){ return "参数的类型是:" + t.getClass().getCanonicalName(); } } public class Teacher<V,S> extends Person{ protected V v; private S s; public Teacher(Object t){ super(t); } public void set(V v,S s){ this.v = v; this.s = s; } }
泛型方法
public class Factory{ public<T> T generator(Class<T> t) throws Exception{ return t.newInstance(); } }
泛型接口
public interface Factory<T>{ public T create(); }
泛型方法使得该方法能够独立于类而发生变化。以下是一个基本的指导原则:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只用泛型方法。另外,对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
Java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就说你在使用一个对象。因此List<String>和List<Integer>在运行时事实上是相同的类型。这两种形式都被擦除称他们的“原生”类型,即List。
必须查看代码确定是否“足够复杂”到必须使用泛型的程度。
擦出的代价是显著的。泛型不能用于显示的引用运行时类型的操作之中,例如转型、instanceof操作和new表达式。因为所有关于参数的类型信息都丢失了,无论何时,当你在编写泛型代码时,必须时刻提醒自己,你只是看起来好想拥有有关参数的类型信息而已。
——摘自《Think in Java》