effective java 之优先考虑泛型
1、Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
2、泛型在使用中还有一些规则和限制:
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(Java.lang.String);
3、两个例子理解泛型
使用泛型的例子:
public class UseGeneric<T> {
private T ob; // 定义泛型成员变量
public UseGeneric(T ob) {
this.ob = ob;
}
public T getOb() {
return ob;
}
public void setOb(T ob) {
this.ob = ob;
}
public void showType() {
System.out.println("T的实际类型是: " + ob.getClass().getName());
}
}
public class UseGenericDemo {
public static void main(String[] args) {
// 定义泛型类UseGeneric的一个Integer版本
UseGeneric<Integer> intOb = new UseGeneric<Integer>(88);
intOb.showType();
int i = intOb.getOb();
System.out.println("value= " + i);
System.out.println("----------------------------------");
// 定义泛型类UseGeneric的一个String版本
UseGeneric<String> strOb = new UseGeneric<String>("Hello UseGeneric!");
strOb.showType();
String s = strOb.getOb();
System.out.println("value= " + s);
}
}
T的实际类型是: java.lang.Integer
value= 88
----------------------------------
T的实际类型是: java.lang.String
value= Hello UseGeneric!
没有使用泛型的例子:
public class NoUseGeneric {
private Object ob; // 定义一个通用类型成员
public NoUseGeneric(Object ob) {
this.ob = ob;
}
public Object getOb() {
return ob;
}
public void setOb(Object ob) {
this.ob = ob;
}
public void showTyep() {
System.out.println("T的实际类型是: " + ob.getClass().getName());
}
}
public class NoUseGenericDemo {
public static void main(String[] args) {
// 定义类NoUseGeneric的一个Integer版本
NoUseGeneric intOb = new NoUseGeneric(new Integer(88));
intOb.showTyep();
int i = (Integer) intOb.getOb();
System.out.println("value= " + i);
System.out.println("----------------------------------");
// 定义类NoUseGeneric的一个String版本
NoUseGeneric strOb = new NoUseGeneric("Hello NoUseGeneric!");
strOb.showTyep();
String s = (String) strOb.getOb();
System.out.println("value= " + s);
}
}
T的实际类型是: java.lang.Integer
value= 88
----------------------------------
T的实际类型是: java.lang.String
value= Hello NoUseGeneric!
4、使用泛型比使用需要在客户端代码转换的类型来的更加安全,也更加容易。
在设计新类型的时候,要确保不需要这种转换就可以使用,这就意味着要把类做成泛型。
每天努力一点,每天都在进步。