1.为何是泛型
1.很多人对泛型一知半解。局限于jdk的集合类。
2.他们总想在泛型内部获得真实类型。
3.他们甚至不知道泛型擦除。
2.泛型本质:其实就是泛型擦除。我们知道泛型只存在于编译阶段。
1.泛型代码在编译时经行泛型擦除。
List<String> 和 List
在编译后是一样的字节码。此处使用泛型的意义在于:使用编译器确保类型的正确性。
List<String> list = new ArrayList<String>();
list.add("hello zha zha");
list.add(5);//编译器直接报错,无法通过编译。`<br><br>
2.所有使用泛型参数的地方都会被替换为该泛型的上界(不做约束都是替换为Object),将在下面讲解。此处使用泛型的意义在于:编写更通用的代码。如:
public interface BaseDao<T extends Serializable>{
int addEntity(T t);
}
//编译后改变为:
public interface BaseDao{
int addEntity(Serializable t);
}
//你能看出这和普通的代码有什么区别吗?
使用泛型的意义也就这两点了,只是做一个强调,不要纠结于分类的正确性!
3.泛型通配符:?
通配符:我持有一种特殊的类型,但是我不知道他是什么类型。
List<?> list1 = new ArrayList<>();
List<?> list2 = new ArrayList<String>();
list1.add("abc");//编译错误
list2.add("abc");//编译错误:因为无法知道持有的特殊类型!假如说通配符(?)匹配的是Integer ,添加的是String岂不是错误了!
Object:我持有任何类型(除基本变量)。
List<Object> list3 = new ArrayList<>();
list3.add("zha zha");
list3.add(list1);
4.泛型上界:容器持有的至少是这个类型
List<? extends User> list = new ArrayList<>();
User user = new User();
RegisterUser registerUser = new RegisterUser();//继承自User
LoginUser loginUser = new LoginUser();//继承自User
//我的容器里面的数据至少是user类型,例如:
User user1 = list.get(0);//无论是loginUser 还是 registerUser 都是 user
//错误实例
list.add(loginUser);//编译错误:如果list是List<RegisterUser> ,他不能add(new LoginUser()),
list.add(registerUser);//编译错误:如果list是List<LoginUser> ,他不能add(new RegisterUser()),
list.add(user);//编译错误:同上。
因为我们没法确定这个容器的类型(RegisterUser or LoginUser)。所以不能添加元素,但是我们能确保获取到的类型至少是User.
5.泛型下界:容器持有的类型大于等于这个类型
List<? super RegisterUser> registerUsers = new ArrayList<>();
User user = new User();
RegisterUser registerUser = new RegisterUser();
LoginUser loginUser = new LoginUser();
Teacher teacher = new Teacher();
users.add(registerUser);//正确,无论是List<RegisterUser> 还是 List<User> 都可以add(new RegisterUser())
users.add(user);//编译错误,因为该user 有可能是LoginUser,该容器有可能是List<RegisterUser>
users.add(loginUser);//编译错误,同上
users.add(teacher);//编译错误,teacher和user没有半毛钱关系
RegisterUser = (RegisterUser) users.get(0);//未必是RegisterUser,有可能是User,也有可能是RegisterUser其他父类,所以要强转
6.立志成为一名合格的渣渣?那么问题来了,
interface UserDao<T extends User & Teacher>
是什么意思呢?