首页
学习
活动
专区
圈层
工具
发布

java泛型之泛型边界

考虑以下代码:  Object[] array = new String[1]; array[0] = 12.450F;  这段代码是可以通过编译的,然而会让静态类型的Java语言在没有任何强制类型转换的情况下出现类型异常...所以你不能写以下代码:  List array = new ArrayList; array.set(0, 12.450F);   这段代码在第一行就无法通过编译,因为你尝试协变一个泛型...其实并不能通过编译,这并不是编译器出现了错误。这里有个逻辑漏洞,我们仔细考虑无界通配符的意义。无界通配符代表其接受任何的实际类型,但这并不意味着任何的实际类型都可以作为其输入和输出。...①可用输入类型   严格意义上同样不能接受任何的类型作为输入,出于严谨目的,我们再从头分析一遍,这次以Minecraft的源代码为例,考虑以下代码:    List没有用过下界通配符,因为其真的很少用。其主要用处之一是在使用Java或第三方的API的泛型类时,对泛参类型不同,但泛参具有继承关系,且主要关注其输入的泛型对象进行归纳。

2.8K10

【C语言】文件操作(上)

("%d\n",a);//当我再次运行这段代码时,一开始a的值还会是之前我输入的值吗?...return 0; } 这段代码很简单,我想给大家表达的意思是,我第一次运行这段代码,调用scanf函数通过键盘给变量a输入一个值,然后程序就结束了。...那么问题来了,当我再次运行这段代码时,我之前给变量a的值消失不见了。 到这里我们就发现了一个问题,我们程序的数据随着程序的结束就会消失不见了。...其背后的原理也很简单,随着程序的结束,操作系统会自动回收内存空间里面的内容,而我们程序的数据就是在内存中存储的。 那我们就会想到能不能用一个外部的容器在程序还未结束时,就将一些关键的数据给保存起来。...就像我们的身份证一样,每个人的身份证都是独一无二的,看到身份证我就知道这个人就是你了。

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

    让你虎躯一震的垃圾代码分类指南

    做为一名老程序员,谁还没有写过几行垃圾代码,我到现在还记得在第二家公司离职时,写的那段超过 600 行一个方法的代码,可以想象后面接手我工作的同事,看到那段代码是什么样的感受。...心中升起一片由衷的佩服,果然乃我辈之将才! 当然我们后端程序员也不能示弱,就比如下面这段示例,代码简洁,命名规范,没个三五年经验写不出来这种代码。 ? 这是一名资深程序员的素养。...当我在知乎看到这个分享,才明白我国的编程大任,已经顺利的传递到了祖国的花朵。...然后再看他熟练的放到c盘里,改后缀为bat,然后在桌面上新建个快捷方式,更改图标,重命名为“六年级教案大全”?! 当我下次再见到他时,他竟然带着两个人一起把整个办公室的电脑都创建了这个鬼东西???...然后我啥也没说,默默接过来,把代码写完,然后给头说了 第二天,这小伙就接到HR通知,明天不用来了。 其实这个程序员还是可以在培养的,也就错了两个地方而已,这个老程序员太认真了。 ?

    69620

    Python基础语法

    ,发现不会输出任何内容,虽然我们定义了一个add函数,但是并没有调用add函数,当我们把# print(add(1, 2))的#去掉时,再右击运行,打印台会输出3。...变量在程序中用一个变量名表示,变量名必须是大小写英文、数字和_的组合,且不能用数字开头,不能使用关键字作为变量。...我们运行下面这段代码,会发现Pycharm打印台需要我们输入2个数,当我们输入第一个数字时,按下Enter,会让我们输入第二个数,输完第二个数,按Enter,程序运行结束。...我们创建了一个People类,People类有一个构造函数,当我们创建一个People类的对象时需要传入一个参数,创建的对象可以调用People类中的方法 异常处理 我们在编写Python程序时,经常会因为一些错误导致剩下的代码无法执行...我们都知道除数不能为0,所以Python程序会 抛出异常,那么我们怎么才能接受这个异常并使程序继续执行下去呢?我们可以使用try...except...finally.

    1.1K20

    12个很好玩的C语言面试题,不来测试下嘛?

    所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如: ?...答:尽管上面的代码并没有释放分配给“ptr”的内存,但并不会在程序退出后导致内存泄漏。在程序结束后,所有这个程序分配的内存都会自动被处理掉。...7.void*和C结构体 问:你能设计一个能接受任何类型的参数并返回interger(整数)结果的函数吗?...这个操作是无效的,因此会造成seg-fault或者崩溃。 10.会改变自己名字的进程 问:你能写出一个在运行时改变自己进程名的程序吗? 答:参见下面这段代码: ?...11.返回本地变量的地址 问:下面代码有问题吗?如果有,该怎么修改? ? 答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。

    1.4K3130

    程序员垃圾代码分类指南

    做为一名老程序员,谁还没有写过几行垃圾代码,我到现在还记得在第二家公司离职时,写的那段超过 600 行一个方法的代码,可以想象后面接手我工作的同事,看到那段代码是什么样的感受。...心中升起一片由衷的佩服,果然乃我辈之将才! 当然我们后端程序员也不能示弱,就比如下面这段示例,代码简洁,命名规范,没个三五年经验写不出来这种代码。 这是一名资深程序员的素养。...以下是小咔的经历: 我曾经在我们学校办公室里看见一个六年级小学生熟练的在文本文档里敲出三行 :start start cmd goto start 我当时就震惊了 然后再看他熟练的放到c盘里,改后缀为...当我下次再见到他时,他竟然带着两个人一起把整个办公室的电脑都创建了这个鬼东西??? 可以想象的是,这位小朋友前途一片光明。 干代码建议处理措施:不建议、不倡导,但可以在自己家的电脑试用!...然后我啥也没说,默默接过来,把代码写完,然后给头说了 第二天,这小伙就接到HR通知,明天不用来了。 其实这个程序员还是可以在培养的,也就错了两个地方而已,这个老程序员太认真了。

    1K30

    程序员垃圾代码分类指南

    做为一名老程序员,谁还没有写过几行垃圾代码,我到现在还记得在第二家公司离职时,写的那段超过 600 行一个方法的代码,可以想象后面接手我工作的同事,看到那段代码是什么样的感受。...心中升起一片由衷的佩服,果然乃我辈之将才! 当然我们后端程序员也不能示弱,就比如下面这段示例,代码简洁,命名规范,没个三五年经验写不出来这种代码。 ? 这是一名资深程序员的素养。...当我在知乎看到这个分享,才明白我国的编程大任,已经顺利的传递到了祖国的花朵。...然后再看他熟练的放到c盘里,改后缀为bat,然后在桌面上新建个快捷方式,更改图标,重命名为“六年级教案大全”?! 当我下次再见到他时,他竟然带着两个人一起把整个办公室的电脑都创建了这个鬼东西???...然后我啥也没说,默默接过来,把代码写完,然后给头说了 第二天,这小伙就接到HR通知,明天不用来了。 其实这个程序员还是可以在培养的,也就错了两个地方而已,这个老程序员太认真了。 ?

    62030

    学会使用函数式编程的程序员(第3部分)

    "不能找到 " + "'" + str + "'" } 这个就是通常所说的“反向重构”(它对我而言有更多的意义),可以用来帮程序员或者程序(例如编译器和测试程序)推理代码的过程一个很好的方法。...在这种情况下,我们必须依赖程序中调用它们的顺序来确定它们的执行顺序。这就是所有命令式语言的工作方式。 第二点必须满足的就是一个函数的输出值不能作为其它函数的输入值。...在本例中,upperMessage 和 quotedValue 都是纯的并且没有一个需要依赖其它的输出,因此,这两个函数可以以任何顺序执行。 编译器可以在不需要程序员帮助的情况下做出这个决定。...别一方面,生产商也不断增加CPU内核芯片的数量,这意味着代码可以在硬件层面上并行执行。使用纯函数语言,就有希望在不改变任何代码的情况下充分地发挥 CPU 芯片的功能并取得良好成效。...这意味着它既能返回一个不同的类型,也能返回一个相同的类型。 但是一旦 a 的类型确定了,a 在整段代码中就必须为这个类型。

    74210

    如何理解Rust的核心特性(所有权、借用、生命周期)

    实际工作中,我们写的代码比这个复杂几万倍,问题也复杂了许多。程序是很难根据写的代码在静态检查阶段就判断出哪一个堆内存什么时候就可以不用了的,完全自动的堆内存回收自然也无法完成。...这就是所说的,任何一个值都只能归属于一个变量,所有权是对值的独占。那第一段代码为什么a没有独占114514呢?...实际上独占了,只不过当我们令b=a时,b获得了一个全新的114514,所以这不妨碍a继续独占它原本的值。但是地址呢?绝对不存在两个地址一模一样,但是指向不同内存空间的可能性,所以这个情况就无从发生了。...如果一个堆空间的地址,只能保存在一个变量里面,那么当这个变量出栈,无法再使用,那么不就代表这个堆空间就无法在程序内使用了吗?那么不就代表这个空间可以被回收了吗?...生命周期标注和调用时候的实参生命周期不一致,但是代码是完全可以运行的,没有抛出错误。原因可以归结为以下两点:定义时,str1和str2的生命周期都不短于结果的生命周期,定义时遵守了生命周期原则。

    1.4K60

    C++入门(上)

    PS:下面只是让uu们看一下C++有多少关键字,不对关键字进行具体的讲解,有些关键字在C语言阶段就已经见过了,对于那些没有见过的,等后面博主会给uu们进行细讲的. 4:命名空间 在讲命名空间以前,我们首先来看下面这段代码...在C++中我们则可以使用域作用限定符::来访问这个全局变量x.域作用限定符在不指定域的情况下默认为全局作用域 4.1:命名空间的概念 在C/C++中,变量、函数和之后博主要讲到的类都是大量存在的,...这个文件中包含了头文件List.h,这个时候我们运行这段代码会发现编译器给我们报错了,这是因为编译器将两个同样名称的命名空间合并在了一起,这个时候就出现了两个一模一样的函数,我们在C语言阶段讲过,一个工程中是不能出现两个一模一样的函数滴...我们可以看到当我们指定了域以后此时编译器不发生报错,那这是为什么呢?...这也就是为什么当我们展开了两个命名空间,此时再去访问value那个变量会发生报错. 5:C++输入与输出 在C语言中有输入scanf与输出printf,在C++中同样也有滴哦!

    14610

    【C语言初阶】 分支语句 if 的全面介绍

    说明: 当我们输入的年龄大于18时就输出 成年! 当我们输入的年龄小于18时就输出 未成年! 这是不是可以选择的就是俩总情况了呢?这个就叫if语句的双分支。...而这样写C语言会当成什么呢? C语言中会先执行18这个条件,当我们输入15时。18的那么就是0。在C语言中假为0,真为1。...18<= age <=30 就会变成0 <=30 看下面这段代码,所以当我们输入15时也会输出青年 怎么解决呢?...在C语言中&&是逻辑与的意思就是并且 所以我们这样写18就完美解决了这个问题。 同时满足18运行看一下 我们的本意是当输入年龄时18时才会输出后面俩条语句。 结果我们输入15时,结果第二条打印语句也输出了。 而带了括号呢? 这是为什么嘞!

    47110

    C语言——oj刷题——判断闰年

    当我们谈到判断闰年时,我们通常会遵循以下规则:闰年是指能被4整除但不能被100整除的年份,或者能被400整除的年份。在C语言中,我们可以通过编写一个简单的程序来实现这一功能。...// 是闰年 } else { return 0; // 不是闰年 } } int main() { int year; printf("请输入一个年份...\n", year); } return 0; } 在这段代码中,我们首先定义了一个名为isLeapYear的函数,它接受一个整数参数year,并根据闰年的判断规则返回1(是闰年...然后在main函数中,我们通过用户输入一个年份,调用isLeapYear函数来判断该年份是否为闰年,并输出相应的结果。 以上就是用C语言实现判断闰年的简单示例。...您可以将这段代码复制粘贴到您的C语言编译器中运行,以验证其正确性。希望这个示例对您有所帮助!如果您有任何其他问题或需要进一步解释,请随时告诉我。

    64210

    Java 泛型详解

    之间并没有任何的关系。...但是按照我们通常的思维习惯,Apple和Fruit之间肯定是存在联系,然而编译器却无法识别,那怎么在泛型代码中解决这个问题呢?我们可以通过使用通配符来解决这个问题: ?...类型擦除 Java泛型中最令人苦恼的地方或许就是类型擦除了,特别是对于有C++经验的程序员。...我们先来看一下下面这个简单的例子: ? 编译器做完相应的类型检查之后,实际上到了运行期间上面这段代码实际上将转换成: ?...我们先来看一下下面这个例子: ? 对于上面这段代码还是很好理解,字符串数组不能存放整型元素,而且这样的错误往往要等到代码运行的时候才能发现,编译器是无法识别的。

    93350

    一文搞定泛型知识

    需转载请联系 494324190@qq.com 泛型是程序设计语言的一种风格,允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。...这里的返回值转换使用的是强制类型转换,由于使用了强制类型转换将类型检查放在了运行时进行,因此代码就变得更加脆弱。...使用 Stack 类还存在一个性能问题,将值类型的实例传递给 Push 方法,运行时将会对它进行装箱操作,频繁的执行值类型装箱操作系统会频繁的分配内存、复制值已经进行垃圾回收,这样就导致了大量的性能开销...这就凸显了一个问题,代码中产生了大量的类似的代码和重复的代码。 另外在没有泛型的情况下如果声明允许包含 Null 值的变量的时候就比较麻烦了。一般情况下我们常用的有两种方法。...六、总结 这篇文章我主要讲解了泛型的一些知识,不能说很全面,但已经覆盖了百分之九十的内容。泛型在开发中可以说是经常用到,良好的使用泛型可以提高代码复用率以及程序的运行性能。

    1.4K10

    原创 | 函数 scanf 前世今生

    ② 为什么是十进制整数?因为代码中的 %d 就是 decimal 的首字母,这表明此时 scanf() 就是希望你输入一个十进制整数,这个 %d 就是所谓的格式控制符。...③ 如果我就是要胡乱输入,你奈我何?这个问题是本文要讨论的重点,先来看看一个很皮的家伙,是怎么戏弄上面这段程序的: ?...当某人输入二百五的时候,这段程序很老实地说他已经250岁了,虽然看起来无可指责,毕竟年龄是他自己输入进去的,但我们总会觉得这个程序缺少一点脑筋,正常来讲它应该要把人的年龄限制在一个合理的范围,比如:1...对上图做点解释: ① 手指敲击键盘时,数据由键盘的驱动程序读取,并被保存在驱动程序中,此时跟scanf()没有半毛钱关系。...④ 如果scanf() 成功搬运了一个数据,那就返回1,如果成功搬运了两个数据,那就返回2,如果没跟任何数据对上眼神,就返回0。

    92020

    (译) Understanding Elixir Macros, Part 2 - Micro Theory

    可能有一些内容会和上一篇重复, 但我认为这对于理解运作原理和 AST 的生成很有帮助. 掌握了这些以后, 你对于自己的宏代码就更有信心了....因此, 在这段代码的展开阶段, Tracer.trace/1会被调用. 我们的宏接受了输入的 AST, 然后必须生成输出的 AST. 之后编译器会简单地用输出的 AST 替换掉对宏的调用....为什么呢?因为宏有两个看似矛盾的性质: 宏也是 Elixir 代码 宏在在最终的字节码生成之前的展开阶段运行 Elixir 代码是如何在被生成之前运行的?它不能....是一样的, 所以当我们调用 get route do ... end 时, 我们实际上是在调用 get(route, do: ...)...理想情况下, 当我们这样做时, 我们不需要关心输入 AST 的内容, 在我们的例子中, 我们只需要在生成的函数中注入函数体, 而不需要关心函数体中实际有什么. 测试这个宏很简单.

    57040

    Linux系统下的Makefile解析

    \n"); return 0; } 接下来,如果我们想想运行这个.c文件让它产生可执行文件,是不是需要在命令行中输入: gcc test.c -o test 但是,如果我们有多个文件,当我们修改了多个文件...但是当我们有了Makefile文件后,就比较简单了: 、 这是我们的一个简单的Makefile,有了它之后,我们只需要在命令行简单输入一个make指令,就能完成gcc test.c -o test,我们输入...它的主要作用包括: 1. 避免与同名文件冲突 默认情况下,Make 会检查目标是否对应一个实际文件: 如果存在同名文件,并且依赖项没有更新,Make 会认为该目标已经是最新的,从而跳过执行。...:具体的编译命令 使用方法: 把这段代码保存为Makefile(注意大小写) 在终端输入make 就会生成一个名为hello的可执行程序 多个文件的情况 假设现在有3个文件: main.cpp...模式规则 当有很多类似规则时,可以用%简化: %.o: %.cpp g++ -c $< -o $@ 这条规则的意思是: "任何.o文件都从同名的.cpp文件生成" Makefile的运行原理

    23310

    从零开始学C语言文件操作:理论与代码详解

    一、为什么要使用文件 在C语言编程中,我们编写的程序数据通常存储在电脑内存里。可一旦程序退出,内存就会回收这些数据,再次运行程序时,之前的数据就找不到了。为了能长久保存数据,我们就需要用到文件。...文件可以把数据存储在磁盘上,即使程序关闭,数据依然存在,下次运行程序时还能读取使用。 二、什么是文件 在程序设计里,文件分为程序文件和数据文件。...四、文件的打开和关闭 (一)流和标准流 在C程序里,数据的输入输出操作涉及到各种外部设备,为了方便程序员操作,就引入了“流”的概念。程序的数据通过流来与外部设备进行交互。...C语言程序启动时,会默认打开3个流: stdin - 标准输入流,大多数情况下从键盘输入数据,scanf 函数就是从标准输入流中读取数据的。...当我们打开一个文件时,系统会自动创建一个 FILE 结构的变量,并填充好相关信息,我们不用关心具体细节,只需要通过一个 FILE 指针来操作这个文件就可以了。

    46910

    面试官不讲武德,居然让我讲讲蠕虫和金丝雀!

    当我们输入“0123456789012345678 9012"时,缓冲区已经溢出,但是并没有破坏程序的运行状态。 ?   当我们输入:“012345678901234567 890123"。...这部分区域的大小在程序运行前就已经确定了,通常这块内存区域属于只读,有些架构也允许可写,在代码段中也有可能包含以下只读的常数变量,例如字符串常量等。   ...当输入 6 时,就修改了对应的这块内存的值。原来这块内存可能存储了其他用于维持程序运行的内容,而且是已经分配的内存。所以,我们程序就会报出Segmentation fault的错误。 7....在32位 Linux上运行这段代码10000次,这个地址的变化范围为0xff7fc59c到0xffffd09c,范围大小大约是 。...7.2 检测栈是否被破坏   计算机的第二道防线是能够检测到何时栈已经被破坏。我们在echo函数示例中看到,当访问缓冲区越界时,会破坏程序的运行状态。在C语言中,没有可靠的方法来防止对数组的越界写。

    1.6K10

    C++复习笔记——0_零碎问题及解决笔记

    如果我们在一个头文件里声明了一个函数,当我们需要定义这个函数(这个定义是唯一的,也就是只能定义一次),或者需要使用这个函数时,我们在 .cpp 中需要 include 这个头文件。...同样地,如果我们在一个头文件里声明了一个类,当我们需要定义类里的成员函数,或者我们需要使用这个类时,我们在 .cpp 中需要 include 这个头文件。...对于C++字符串的输入我们看一下下面这段代码: string s; //定义空字符串 cin >> s; //输入字符串 cout << s; //打印 但我们会发现如果我们输入了还有空格的字符串...在 C++ 中 main 函数前面为什么要加上数据类型,比如: int void ? main 函数的返回值是返回给主调进程,使主调进程得知被调用程序的运行结果。...如果程序的运行结果不需要返回给主调进程,或程序开发人员确认该状态并不重要,比如所有出错信息均在程序中有明确提示的情况下,可以不写 main 函数的返回值。

    59530
    领券