首页 > 其他分享 >KTV和泛型(3)

KTV和泛型(3)

时间:2022-10-10 11:33:54浏览次数:45  
标签:通配符 KTV 宠物 list Cat 泛型 new

泛型除了KTV,还有一个让人比较疑惑的玩意,而且它就是用来表达疑惑的:?

虽然通过泛型已经达到我们想要的效果了,例如:

List<String> list = new ArrayList<String>();

这样就可以放心地存取String类型的数据。

但是(抱歉,凡事总有个但是),应用的场景总是在不断增加的。某一天:

老板:咱们之前给客户开发的功能中有个地方要改一改。

神牛:哪里要改呢?

老板:以前你写的代码List<Cat> list = new ArrayList<Cat>();只能列出Java宠物店托管的猫咪,但是现在Java宠物店已经扩大了经营范围,希望列出他们保管所有的宠物,只要是宠物就行......

神牛:这个easy!

老板:真的吗?

于是,神牛一通操作,代码就改成了这样:

class Cat extends Pets {};
class Dog extends Pets {};
public static void main(String[] args) { List<? extends Pets> list = new ArrayList<Pets>();
Pets pets = list.get(0);
Cat cat = (Cat)list.get(1);
Dog dog = (Dog)list.get(2);
}


然鹅,过了一段时间,Java宠物店由于经营不善,已经将之前的宠物转卖、送人了一部分,现在就剩一些猫科动物,所以现在的宠物笼子需要重新分配,只要是猫科动物就要往里放。以前写的代码

List<? extends Pets> list = new ArrayList<Pets>();

就满足不了给宠物分配笼子的需求了(先想一想为啥不行了?)

神牛继续把键盘一顿猛敲,代码又改成了这样:

class Felidae {};

class Cat extends Felidae {};

public static void main(String[] args) {
List<? super Felidae> list = new ArrayList<Felidae>();
Cat cat = new Cat();
list.add(cat);
}


这样一改,以前的功能又不能用了(为啥不能列出保管的宠物了?)


从以上需求场景可以看到:

1、对于不确定或者不关心实际要操作的类型,可以使用无界通配符(尖括号里一个问号,即 <?>),表示可以持有任何类型;

2、<? extends T>称之为「上界通配符」,表示只允许T及T的子类调用,例如只允许宠物类Pets的子类Cat和Dog调用;

3、<? super T>刚好相反,称之为「下界通配符」,表示只允许T及T的父类调用,例如只允许Cat的父类Felidae调用;

4、由于上界通配符<? extends T>中只知道T这个父类,而不知道具体的子类(所以用?代替),因此它无法实现向列表中加入新元素的功能,也就是做不到list.add()(这就是为什么满足不了给宠物分配笼子的需求);

5、而由于下界通配符<? super T>中只知道T这个子类,而不知道具体的父类(所以用?代替),因此它无法实现从列表中获取元素的功能,也就是做不到list.get()(这也是为什么满足不了列出保管的宠物)。


刚才说了那么多,稍稍有点绕。总结一下:

由于<? extends T>的只能取,不能存;而<? super T>得只能存,不能取,因此在架构设计中就有一个推荐的实践经验:

1、生产者producer一般用<? extends T>

2、消费者consumer一般用<? super T>


泛型讲到这里,如果能够全部明白,就可以真正畅快地去KTV嗨了。而泛型其他的知识点,像什么无界通配符、泛型参数一致性、多重限定、基类劫持接口、自限定类型、循环泛型等乱七八糟的可以统统不去管了,因为很多工程师一辈子的职业生涯中几乎都碰不到它们,除非点背到极点。还是最开始的那几个建议:

1、不钻牛角尖,有问题见招拆招

2、解决主要宏观上、业务上的问题,暂时忽略次要的技术上的、细节上的问题

3、抓大放小,用好80/20原则


标签:通配符,KTV,宠物,list,Cat,泛型,new
From: https://blog.51cto.com/u_15817148/5742974

相关文章

  • KTV和泛型(1)
    说起KTV恐怕没几个人不知道的。虽然这玩意没有过去那么火热了,但喝了酒之后再去飙几个高八度的爆破音还是蛮爽的。但Java里面也有一个基础特性用到了KTV——泛型。泛型,它的作......
  • KTV和泛型(3)
    泛型除了KTV,还有一个让人比较疑惑的玩意,而且它就是用来表达疑惑的:?虽然通过泛型已经达到我们想要的效果了,例如:List<String>list=newArrayList<String>();这样就可以......
  • KTV和泛型(2)
    很多使用泛型的小伙伴,都会有一个疑惑:为什么有的方法返回值前带<T>、<K,V>之类的标记,而有的方法返回值前又什么都不带呢?就像这样://实体基类classEntity{publicS......
  • C#委托之一例看懂泛型委托
    以为委托在编程中频繁使用,所以微软为使开发者方便使用委托,省去繁琐的重复定义。给我们提供了三种定义好的泛型委托,分别是Action、Func和Predicate。下面分别介绍Action:......
  • Java 一个List泛型根据另一个List泛型的属性进行过滤
    这个需求是在批量入库的时候,进行批量校验用到的1.逻辑是传入List参数,需要入库2.根据List去查询库中是否存在3.用传入的List进行过滤,获取苦衷不存在的resList4.插入resLi......
  • 【Java基础】泛型概述、泛型方法、泛型接口、类型通配符及可变参数的使用
    目录​​一、泛型概述和好处​​​​二、泛型类​​​​三、泛型方法​​​​四、泛型接口​​​​五、类型通配符​​​​六、可变参数​​​​可变参数的使用​​一、泛型......
  • net中c#教程 list泛型的常用操作
    上一篇讲的是非常基础的string字符串操作,这在c#的应用非常广泛。今天深入一点,讲下List泛型的一些用法。对于泛型的增删改查操作,找本c#的基础教程书籍,看看就行了。   ......
  • 算法 玩转数据结构 2-6 使用泛型
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13411 1重点关注1.1泛型改造==转equals详见3  2课程内容见3 3......
  • C#委托总结 普通委托、泛型委托、匿名委托
     一、概念委托的本质也是一种类型,类似于Class这样。作用是将一个方法作为参数传递给另一个方法,关键字是delegate 二、委托的定义使用步骤第一步声明委托:publicdel......
  • Java泛型
    Java泛型本文源自https://www.yuque.com/qingkongxiaguang/javase/syy4rz#29e0f372欢迎大家去看b站这个Up主的Java视频https://www.bilibili.com/video/BV1Gv411T7pi?p=......