泛型
泛型(Generic type 或者 generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
泛型的好处
类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
使用语法
1)泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2)同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3)泛型的类型参数可以有多个。
4)泛型的参数类型可以使用extends语句来做类型限制(不管后面是接口还是类都用extent),例如<T extends superclass>。习惯上成为“有界类型”。默认情况,extends object。
5)泛型的参数类型还可以是通配符类型(应对未知类型)。
例如Class<?> classType = Class.forName(ArrayList);
Class<?> classType = Class.forName(LinkedList);
2)同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3)泛型的类型参数可以有多个。
4)泛型的参数类型可以使用extends语句来做类型限制(不管后面是接口还是类都用extent),例如<T extends superclass>。习惯上成为“有界类型”。默认情况,extends object。
5)泛型的参数类型还可以是通配符类型(应对未知类型)。
例如Class<?> classType = Class.forName(ArrayList);
Class<?> classType = Class.forName(LinkedList);
简单例子
public class GenericFoo<T> {
private T foo;
public T getFoo() {
return foo;
}
public void setFoo(T foo) {
this.foo = foo;
}
public static void main(String[] args) {
GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>();
GenericFoo<Integer> foo2 = new GenericFoo<Integer>();
foo1.setFoo(new Boolean(false));
foo2.setFoo(new Integer(3));
Boolean b = foo1.getFoo();
Integer i = foo2.getFoo();
System.out.println(b);//false
System.out.println(i);//3
// foo1 = foo2;
GenericFoo a = new GenericFoo();
a.setFoo("hello");
String str = (String) a.getFoo();
System.out.println(str);//hello
}
}
基本接口类
public interface IBaseDao<T> {
public Serializable save(T o);
}
节本实现类
public class BaseDaoImpl<T> implements IBaseDao<T> {
@Override
public Serializable save(T o) {
return null;
}
}
业务实现接口
public interface IUserDao extends IBaseDao<User> {
}
业务实现接口
public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao {
}
调用
public class Client {
public static void main(String[] args) {
IUserDao daoI=null;
User t=null;
daoI.save(t);
}
}