首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

面试常问的PECS原则,到底是什么鬼?

以下内容请在安静的场所、充足的时间查看,因为非常的绕,容易把人绕晕。 PECS的全程Producer Extends Consumer Super,第一次听说,一脸懵逼。...但看到jdk中越来越多的泛型代码决定去了解一java的泛型,只在编译期有效。也就是说,编译之后的字节码,已经抹除了泛型信息。 其实,对于常年接触业务代码的同学来说,泛型用的并不是特别多。...当你使用设计模式设计代码,或者在设计一些比较底层的框架时,肯定会碰到这个问题。 一个例子 泛型该怎么写?我们首先看一jdk中的一些例子。...extends T>,只要后面的new,声明的T的子类或者T本身,那么都是没错的。反之,如果的父类,则报错。这很好理解,后半部分的实例,一定要能够全面覆盖前面的声明。...这个过程可真是绕,认为这是定义非常失败的一个名词。 End 现在,再来看我们文章头部jdk的类Consumer,是不是有了新的理解?其实,这个函数和函数编程相关的。

2.4K11

Java 8——行为参数化

本身没有太大的体会,但新增的这些功能,每一个都让兴奋,这里就书中的内容简单的介绍一Java 8的这些新特性,相信很快,你也会有跟我一样的感受。...(1)用行为参数化把代码传递给方法 Java 8中增加了通过API来传递代码的能力,但这实在听起来太绕了,这到底在说什么!...Java一个机制称为匿名类,它可以让你同时声明和实例化一个类,它可以帮助你进一步改善代码,让变得更简洁: List redApples = filterApples(inventory...第一,往往很笨重,因为占用了很多空间,还拿前面的例子来说: ? 第二,很多程序员觉得它用起来很让人费解,比如这里有一道经典的Java谜题,让大多数程序员都措手不及,来试试看: ?...答案5,因为this指的是包含的Runnable,而不是外面的类MeaningOfThis。 整体来说,啰嗦就不好。

98070
您找到你想要的搜索结果了吗?
是的
没有找到

Kotlin 的 val list: ArrayList= ArrayList() 居然报错!

也许看了我们的题目,大家还没有明白过来到底发生了什么,那么请大家再仔细看看: val list: ArrayList= ArrayList()...就是泛型参数后面的 > 处。 这就让人不理解了,看上去并没有什么问题啊。我们再来看看错误提示: ? 嗯?说 > 那个地方缺个 > ? 什么鬼。。...3 对比看看其他语言 能够出现类似语法的,我们可以对照一 Swfit 和 Scala。 先说说 Scala,的解析器应该是极其强大的,毕竟人家允许各种字符作为运算符啊。。 ?...好啦,其实这都不是什么大问题了,这篇文章探讨的那句代码本身就比较蛋疼: val list: ArrayList= ArrayList() 就问你为什么不去掉前面的类型,类型推导难道还不够吗...因为其实位移这种根本没什么人用的,直接换成一个方法其实在概念理解上简单多了。 还有觉得Scala 用[ ]来表示泛型比好多了以前看一个人说后者写起来感觉很反人类或者看上去很奇怪,很赞同。

1.2K10

java泛型之泛型边界

Java数组能够协变一个设计上的根本错误,它能导致你的代码在你完全不知情的情况崩溃和异常,但现在改已经为时已晚。...return weWantFloatFilled; }  注:试了一,以上代码执行looksGood()时会出错,第4行报java.lang.ArrayStoreException。...所以你不能写以下代码:  List array = new ArrayList; array.set(0, 12.450F);   这段代码在第一行就无法通过编译,因为你尝试协变一个泛型...看成Object,往一个Object类型的列表加一个String有什么问题?况且其实际就是String类型。其实并不能通过编译,这并不是编译器出现了错误。...往一个EntityLiving的列表里加EntityPlayer有什么问题?放肆!12450!好不闹/w\。这里的问题在于如果实际上EntityPig的列表呢。

2K10

面试官问我:“泛型擦除是什么,会带来什么问题?”

探索真相 上述的就是泛型擦除的一种表现了,但是为了更好的理解,当然要更深入了吧。虽然List很大,但却也不是不能看看。...super Apple> fruit1 = new ArrayList(); 同理为了解决这样的问题,Java引入了super关键词,作用域如下图: 至于什么不变,就不说了。...extends Fruit> fruits = new ArrayList();,他为我们这几个毛头娃儿所创建,他这次Apple,另一个人就可能Orange、还有人可能Pear,这样会出现什么问题...从字面意思理解就是,extends限制数据来源的(生产者),而super限制数据流入的(消费者)。而显然我们一些经常使用到的代码中也都是符合了这一规则。...说extends拿取,super存储这不是正好反了吗? 其实是相同的,就那我们上面的案例来说好了。

2.1K41

大白话说Java泛型:入门、使用、原理

但其实这样的代码存在一定隐患,因为可能过了不久我们就会忘记到底我们存放的 list 里面到底第几个 String,第几个 Integer 了。...泛型中的向上转型 当我们明白了编译时类型和运行时类型之后,我们再来理解通配符的诞生就相对容易一些了。 还是上面的场景,我们有一个 Fruit 类,Apple 类 Fruit 的子类。...正是为了解决保持「向上转型」概念在 Java 语言中的统一,使泛型也支持向上转型,所以 Java出了通配符的概念。...因为无论取出苹果,还是橙子,还是香蕉,我们都可以通过向上转型用 Fruit 类型的变量指向,这在 Java 中都是允许的。...总结一,我们通过 extends 关键字可以实现向上转型。但是我们却失去了部分的灵活性,即我们不能往其中添加任何东西,只能取出东西。

83760

当我们谈论Monad的时候(一)

也一直很想写一写自己关于Monad的见解,但是一直找不到合适的说明方式。先前在某群提到,从Optional(也就是Haskell的Maybe)理解Monad会是一个很不错的方式。...而第一篇作为工程部分,自然用的大家最喜欢的Java主要是最喜欢来讲解了。 不过先打个预防针,本篇文章站在工程角度的浅显介绍,因此语言可能不甚严谨。...Monad层数很高的抽象 和Runnable一样,Monad一个功能的抽象。在Java中,我们可以用接口类来描述。就像你说ThreadRunnable一样,我们也同样可以说XX类Monad。...根据Monad的不同,实际表现出来的作用很可能相当不同。觉得代码复用的最高层次也莫过于此。 不确定性之盒 说了那么多,你应该能了解到Monad只是一个抽象结构而已。...下一个话题 到这里,关于Monad工程角度的介绍就结束了。个人认为,只是理解Monad的用途没有必要,也没有意义去看Monad背后的数学定义的。 不过只从工程角度理解Monad远远不够的。

40710

《Arthas系列2》三分钟理解Java如何使用命令行

今天学习一Arthas如何打印出当前机器上的所有Java线程的和调用控制台的,这个技术点不清楚,我们从Arthas的代码中找出实现,学习知识点,在下次自己用的时候可以有思路,但是Arthas...java -jar arthas-boot.jar 1.2 读代码,既然要读代码了就不能怕读代码,读代码不需要任何的环境,不要任何的测试,不需要任何的条件,只要跟着代码的走向即可。...不要想那么多,直接全局搜索,找到下面的不少用处,我们稍微扫一就看到了很多地方不是代码调用,我们直接定位到Arthas-boot,OK,我们找到了这个代码的源头,直接进入理解阶段。...2、如何实现自己的java 进程列表 在跟踪代码代码的过程中,也要理清楚思路,作者到底怎么做成这件事,如果你 会有什么样的思路,如果你的思路刚好和作者的不谋而合,相信你理解起来代码就很简单,如果你的思路和作者的不同...jps java提供的一个显示当前所有java进程pid的命令,我们发现了事情的核心。 1.3 如何找到jps ?

60580

用了这么多年的 Java 泛型,你对到底有多了解?

本篇文章 idea 来自用了这么多年的泛型,你对到底有多了解?,恰好当时看了「深入 Java 虚拟机的第三版」了解泛型的一些历史,感觉挺有意思的,就写了写 Java 版的泛型。...这么做对于引用类型来说没有什么问题,毕竟 Object 所有类型的父类型。但是对于 int/long 等八个基本数据类型说,这就难办了。...当泛型出现在方法输入位置的时候,由于 Java 可以向上转型的,这里并不需要强制类型转换,所以没有什么问题。...下面这段代码,从源码上两个 List 看起来不同类型的集合,但是经过泛型擦除之后,集合都变为 ArrayList。所以 if语句中代码将会被执行。...这种特性明确写入 Java 语言规范的,这是一个Java 使用者的一个严肃承诺。 这里强调一,这里的向后兼容性指的是二进制兼容性,并不是源码兼容性。

71010

为什么阿里规约手册要求谨慎使用Arrays.asList方法

: image.png 阿里Java规约中的强制性要求 在阿里Java规约中有强制性的要求:使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,的 add/...image.png 阿里规约里已经提示了asList返回的对象是Arrays的一个内部类。那么这个内部类,跟我们一般用到的List(如ArrayList)有什么不一样之处呢,下面我们就来分析。...Arrays.asList()源码分析 通过IDEA查看该方法源码,如下: image.png 这里返回了一个ArrayList,看起来似乎没什么问题,但是这个ArrayList跟我们常用的java.util.ArrayList...通过IDEA点击跳转,可以看到该ArrayListArrays的一个内部类。...(); } 复制代码 可以看到,这里抛出了UnsupportedOperationException。

42210

什么?RecyclerView中获取点击位置的接口被废弃了?

在看完这段解释之后也是不能理解,为什么这个方法当多个adapter嵌套时会存在歧义?...百思不得其解的时候,突然想起来前几天隔壁鸿洋大神的公众号里推荐了一篇文章,讲的是Google新推出了一个MergeAdapter。直觉告诉,可能和这个新功能有关。...那么MergeAdapter到底有什么作用呢?简单看了一介绍就明白了,因为这就是一直想要追求的功能啊! 的主要作用很简单,就是将多个Adapter合并到一起。...从名字上就可以看出来了,一个用于获取元素位于当前绑定Adapter的位置,一个用于获取元素位于Adapter中的绝对位置。 如果觉得面的解释还不够清楚,通过下面的示例看一你立马就能明白了。...另外说一,由于《第一行代码 第3版》已经出版,以后未来自己编写的所有文章都会使用Kotlin语言,Java就不再使用了,想学习Kotlin语言的朋友们可以考虑一这本书。

4.3K43

报告,书里有个BUG!

你好呀,why。 这样的,在看《深入理解 JVM 虚拟机》(第三版)的时候发现一个有意思的 BUG。 给大家汇报一。...啥 BUG 先直接给大家上个代码,也是书上的示例代码,你思考一,能不能实现这个需求: 绝大部分人的第一反应就是 super 关键字。...如果你的运行结果还是 i am grandfather,那么兄弟,你的 JDK 版本该升级一了。 那么到底修复了什么问题呢?...的直接父类又是什么? 来,给你 Debug 一: 通过截图我们知道最后一个参数其实就是当前类,即 son。 的直接父类又是什么?...调用者敏感,这样理解的:不同调用者,访问权限不同,其结果也不同。

34720

Kotlin中?和!!的区别

不过觉得对于一个刚接触KT(Kotlin)的新手来说,他恐怕需要有汉语八级才能透彻理解这两句话的意思。 先阐述两个概念: "?"加在变量名后,系统在任何情况不会报的空指针异常。 "!!"...先拿Java代码举个例子 ArrayList myList = null; // 创建一个null的队列 Log.d("TAG", "-->>...加上去后好像并没有和之前Java代码有什么区别嘛,该null的地方任然会抛出异常。所以大多数情况都会使用?来检测null,轮不到!!出场。!!...那我们接下来着重讲解一?到底怎么用。在声明对象时,把跟在类名后面,表示这个类允许为null;在调用对象时,把跟在对象后面,表示如果为null程序就会视而不见。...:表示的意思,当对象A值为null的时候,那么它就会返回后面的对象B。 val roomList: ArrayList?

1.1K10

Java笔记-Previous方法反向遍历没反应的问题

前言  今天在学习集合分支List的特有迭代器ListIterator时遇到两个疑惑,这是第一个,由于角度比较奇怪,教学视频里也没有提及,在和度娘一番攀谈交心后,仍是一知半解,但这么巧的,在第二个疑惑中找到了它们的共通之处...hasPrevious()这两个方法,根据方法描述,我们很容易理解为就是 从集合的最后一位开始返回前一个元素 以及 从最后一位开始判断前面是否存在元素,于是在测试学习这个方法时出了这样的代码 以下附上代码及图示...,方便大家理解遇到的这个问题 import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public...()的返回值就为false也就不会运行while里的代码块,即便为true,previous()也会报错,大家尽可以试试,这里就不做展示了,为了方便大家理解画了张图供大家理解 问题的解决 解决方法...,前提必须先正向遍历到结尾,让“指针”指向最后一位索引,然后才能逆序遍历 其代码如下 import java.util.ArrayList; import java.util.List; import

1.2K10

ArrayList的循环中删除元素,会不会出现问题?

,下面截取的关键代码Java1.8)。...null 3.5、返回 fase 4、返回 true 这里有个疑问,第一个 remove() 方法中的代码和 fastRemove() 方法中的代码完全一样的,第一个 remove() 方法完全可以向第二个...这里注意 expectedModCount 变量和 modCount 变量,modCount 在前面的代码中也见到了,记录了 list 修改的次数,而前面还有一个 expectedModCount,这个变量的初值和...而方法一在单线程和多线程中都是可以正常删除的,多线程中测试代码如下,这里只模拟了三个线程: import java.util.ArrayList; import java.util.Iterator;...的循环删除有问题,发散一思维,Python 中的列表删除会不会也有这样的问题呢,抱着好奇试了试,发现下面的方法一也同样存在不能删除连续重复元素的问题,方法二则报列表下标越界的异常,测试代码如下,

2.8K20

java8出来都5年了,内部迭代你懂了吗?

代码中的区别 内部迭代这个词在java8的时候进入了的视线,当时读书看博客, 总结一就是以下三段代码的区别 List list = new ArrayList();..., 外部迭代由用户自己在客户端中写的循环代码, 内部迭代由Jdk在库中执行的循环代码, 即循环写的位置从外部转移到了jdk内部....在循环A中,我们往往最关心的循环体内的东西,即,这个循环到底对s做了什么, 但是在外部迭代中, 我们隐式的规定了很多,比如说,只能从第一个元素开始循环, 但其实很多场景,是不是从第一个开始循环对我们的业务影响并不大...如上述内部迭代和外部迭代的区别, 一直以来能区别出哪种内部的哪种外部的,但也始终说不明白,自书上看到之后,有种醍醐灌顶的感觉, 原来如此! 学习本就是枯燥的事,只有耐得住枯燥,才能超越自己!...大家在学习过程中有什么问题,欢迎留言和小刀交流

55420

为什么阿里规约手册要求谨慎使用 Arrays.asList 方法

阿里Java规约中的强制性要求 在阿里Java规约中有强制性的要求:使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,的 add/remove/clear 方法会抛出...阿里规约里已经提示了asList返回的对象是Arrays的一个内部类。那么这个内部类,跟我们一般用到的List(如ArrayList)有什么不一样之处呢,下面我们就来分析。...这里返回了一个ArrayList,看起来似乎没什么问题,但是这个ArrayList跟我们常用的java.util.ArrayList不一样。...通过IDEA点击跳转,可以看到该ArrayListArrays的一个内部类。 ? 该内部类的源码其实不多,通过IDEA的structure,我们可以看到实现的方法如下: ?...如果把其返回的ArrayList当做了我们常用的java.util.ArrayList,那么很容易埋下生产隐患的。

44710
领券