其实早在1999年的JSR 14规范中就提到了泛型概念,知道jdk5泛型的使用才正式发布,在jdk7后,又对泛型做了优化,泛型的推断.
泛型类
public class Pair<T> { private T first; private T second; public Pair() { first = null; second = null; } public Pair(T first, T second) { this.second = second; this.first = first; } public void setFirst(T newValue) { first = newValue; } public void setSecond(T newValue) { second = newValue; } }
怎么理解泛型类的定义.首先在类名后根上<T>这个T就是任意类型.在 Java 库中, 使用变量 E 表示集合的元素类型, K 和 V 分别表示表的关键字与值的类型。T ( 需要时还可以用临近的字母 U 和 S) 表示“ 任意类型”。然后在类中的成员,都可以使用这个T,你既可以把T当做参数,也可以把T当做返回值.也可以把T当做成员变量的类型.这个T到底存储的什么类型,取决于你在实例化Pair时指定的具体类型.但是以上写法,你一旦指定了一个实际类型,那么这个类中所有的T都会是同一个类型.
public class Main { public static void main(String[] args) { Pair<String> pair = new Pair<>(); pair.setFirst("第一"); pair.setSecond("第二"); } }
你也可以在一个泛型类上定义多个泛型
public class Pair<T,U> { private T first; private U second; public Pair() { first = null; second = null; } public Pair(T first, U second) { this.second = second; this.first = first; } public void setFirst(T newValue) { first = newValue; } public void setSecond(U newValue) { second = newValue; } }
但是你需要记得,因为泛型的作用域在类级别.一下写法是错误的.
你在类上定义了个T表示,你所实例化的每一个类都要指定一个类型,现在,现在你试图不做类的实例化,而直接使用T,那么这个T你要从哪里定义呢?记住要使用泛型,先确定泛型的具体类型.
泛型方法
public class Demo3 { public <T> void show(T t){ System.out.println(t.toString()); } public static <S> void show2(S s){ System.out.println(s); }
public class Main { public static void main(String[] args) { Demo3 demo3 = new Demo3(); demo3.<String>show("a"); demo3.show("a"); Demo3.show2(1); } }
你在一个方法上指定了泛型,即泛型的作用域在方法体上,也就是说,你每次调用方法都要指定具体的类型.当然你不用每次调用都使用<T>语法,因为jdk7的泛型推断.编译器自然可以通过你的实参而推断出你想要的实际类型.将泛型定义到方法上,泛型的T可以用到参数,方法体,返回值.
当然在你指定泛型时,也可以有以下写法
public class Demo1 { public <String> void add(String t){ } }
不过这通常是没有任何意义的,否则,你要想表达什么呢?定义了一个泛型方法,并且限定泛型的实际类型是String?
泛型的擦除