战五渣系列之四(精通泛型)

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>
是什么意思呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值