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

用了这么多年 Java ,你对到底多了解?

本篇文章 idea 来自用了这么多年,你对到底多了解?,恰好当时看了「深入 Java 虚拟机第三版」了解一些历史,感觉挺有意思,就写了写 Java。...ps:并不是每一个参数被擦除类型后都会变成 Object ,如果类型为 T extends String 这种方式,最终擦除之后将会变成 String。...所以当时 Java 给出一个简单粗暴解决方案:既然没办法做到转换,那就索性不支持原始类型了。 如果需要使用,那就规定使用相关包装,比如 ArrayList。..., List 集合是可以存储不同类型数据,那么引入之后,这段代码必须能正确运行。...为了保证这些旧 Clas 文件能在 Java5 之后正常运行,设计者基本两条路: 需要容器(主要是容器类型),以前有的保持不变,平行增加一套新版本。

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

游刃有余:玩转Java

Java提供了一种创建可以处理不同类型数据可重用代码方法。允许用户定义可操作各种数据类型、接口和方法,而无需牺牲类型安全性。...在 Java 5 中引入已经成为 Java 编程语言一个基本特性。 在 Java 引入之前,使用原始类型允许将各种类型对象存储在集合中。...上界通配符允许作为指定类型类型任何类型,而下界通配符允许作为指定类型类型任何类型方法:除了和接口之外,Java 还支持方法。...这些方法自己类型参数,可用于指定其参数类型并独立于封闭或接口返回值。 带来了许多好处,比如提高了类型安全性、促进了代码重用,并且能让代码更加简洁。...这些示例演示了 Java多功能性,允许您以类型安全方式处理不同类型Java 通配符 Java通配符提供了一种指定未知类型或一系列类型方法。

12610

滚雪球学Java(20):Java与枚举:提升代码灵活性与可读性

枚举常常在需要表达一个有限、离散取值范围时使用,如星期几、月份等。概念  Java一个特性,允许使用者在编写代码时不指定数据类型,在运行时才确定数据类型。...语法在Java中,使用语法以下两种方式:  是一种拥有一个或多个类型变量。...总结来说,该代码实现了一个简单Pair,用于表示键值对。通过使用参数,可以实现对任意类型键值对进行封装和操作。这种在实际开发中非常有用,可以方便地存储和处理不同类型数据。...这个例子展示了使用好处,允许我们在创建对象时指定不同类型参数,从而使代码更加灵活和可重用。...枚举概念  枚举(Enum)是Java一种新类型,用于表示一组有限数值或者常量。枚举类型可以看作是一种特殊只有有限个实例,每个实例一个唯一名称和一个相应值。

8821

从 Kotlin 开发者角度看 Java 缺失特性

Java var 关键字完全不同。首先,只能用于局部变量。更重要是,没有提供与之对应不可变 val 关键字,你仍然需要添加 final 关键字,但几乎没有人使用它。...= computeNullableString() 扩展函数 在 Java 中,扩展一哥是通过继承来实现: 继承两个主要问题。第一个问题是有些允许继承:它们使用了 final 修饰符。...几个被广泛使用 JDK 就是 final ,例如 String。第二个问题是,如果我们无法控制方法返回一个类型,那么不管它是否包含我们想要行为,都只能使用这个类型。...语法要清晰得多,并且允许函数链接,这在 Java 中是不可能做到。 具体化 Java 5 中引入了。...与之相反是具体化,也就是说,类型将被写入字节码中。 编译时类型存在一些问题。

77020

带着问题高效学Android:关于Java与Kotlin你应该知道知识点

接口定义 引入一个类型变量T(其他大写字母都可以,不过常用就是T,E,K,V等等),并且用括起来,并放在后面。允许多个类型变量。...这只是一个普通成员方法,只不过他返回值是中已经声明了。 怎么限定类型变量? 有时候,我们需要对类型变量加以约束,比如计算两个变量最小,最大值。...不知道,但是可以肯定说,Object一定是,所以get方法返回Object。编译器是可以确定知道。对于set方法来说,编译器不知道需要的确切类型,但是X和X子类可以安全转型为X。...或是运行期CLR中,都是切实存在,List<int>与List<String>就是两个不同类型,它们在系统运行期生成,自己虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现称为真实...语言来说,ArrayList<int>与ArrayList<String>就是同一个,所以技术实际上是Java语言一颗语法糖,Java语言中实现方法称为类型擦除,基于这种方法实现称为伪

1.1K00

kotlin入门之

Java类型会在编译时发生类型擦除,为了保证类型安全,不允许这样赋值、 至于什么是类型擦除,等下再讲。 在实际使用中,我们的确会用这种类似的需求,需要实现上面这种赋值。...extends 叫做 上界通配符,让Java具有协变性,协变就是允许上面 赋值是合法。 它有两层意思: 其中?...extends TextView> 类型是个未知类型 ?,编译器也不确 定它是啥类型,只是个限制条件。 由于满足 ?...var list: List 和 Java 不同地方是,如果你类型定义里已经了out或者 in, 那这个限制在变量声明时也依然在,不会被*号去掉。...b() } 多个参数 //该函数返回类型R必须继承Number, T 必须实现Comparable 接口,并且是一个返回类型为R方法 fun callMax(a:T

1.1K20

基本原理

定义了一个属性成员,该成员类型一个类型,这个 T 具体是什么类型,我们也不知道,只是用于限定类型。...但是实际上编译器不仅关注一个方法调用,它还会为某些返回值为限定类型方法进行强制类型转换,由于类型擦除,返回值为类型方法都会擦除成 Object 类型,当这些方法被调用后,编译器会额外插入一行...方法就是一个方法,依赖外围 ArrayList 声明 E 这个类型,也就是没有自己声明一个类型而用外围。...类型限定 这里类型限定其实指的是这么个语法: 既可以应用于或者接口定义上,也可以应用在方法定义上,声明了一个类型 T,并且 T 类型必须是...所以子类数组实例赋值父数组实例,只不过意味着父数组实例引用指向堆中子类数组而已,并不会有所冲突,因此是 Java 允许这种操作。 而是不允许这么做,为什么呢?

54900

Java集合面试题(含答案)

4、常用特点 (待补充) Java SE 1.5之后特性, 《Java 核心技术》中对定义是:“” 意味着编写代码可以被不同类型对象所重用。...以集合来举例,使用好处是我们不必因为添加元素类型不同而定义不同类型集合,如整型集合,浮点集合,字符串集合,我们可以定义一个集合来存放整型、浮点,字符串数据,而这并不是最重要,因为我们只要把底层存储设置了...声明和非声明类似,除了在名后面添加了类型参数声明部分。...和方法一样,类型参数声明部分也包含一个 或多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称标识符。...在生成 Java 字节代码中是不包含类型信息。使用时候加上类型参数,会被编译器在编译时候去掉。这个过程就称为类型擦除。

1.1K30

Java学习笔记

参考书籍 《Java核心技术:卷1》 , 先睹为快 先通过一个简单例子说明下Java用法: 基本形式类似于模板, 通过一个类型参数T, 你可以"私人定制"一个,具体定制范围包括实例变量类型...“只要写一个模板就OK了嘛~ 等要使用时候再传入具体类型,多省心”, 当你这么思考时候:浮现在你脑海里,就是程序设计(Generic pogramming)思想 在介绍Java机制之前..., 先让我们来看看, 还没加入机制程序设计”是怎样子 程序设计1.0: 不用Java机制 下面我们编写一个存储不同对象列表,列表设置(set)和取值(get)两种操作。...setData (T data) {     this.data = data;   } } 方法 也可以定义一个方法: 变量T放在修饰符(这里是public static)后面, 返回类型前面...如果限定类型既有超也有接口,则:超限定名必须放在前面,且至多只能有一个(接口可以多个) 这个书写规范和继承和接口实现所遵循规则是一致(不允许多继承,但允许接口多继承书写时候继承是写在接口实现前面的

1.2K80

接口,通配符

定义,public class Man{...},在名后面加上类型参数T,这样就定义了一个。 ? 接口不同构造器,并且构造器也可以使用类型参数。...如果java里面没有继承这个特性,那么到这里就讲完了,但是,正因为java继承这个特性,会导致很多其他问题出现,其复杂程度会几何级上升,后面的知识点对抽象能力和思维能力较高要求,请做好战斗准备...添加子类父 上面例子可以看出,如果类型子类,添加类型子类是可以,但是如果类型,往集合添加类型会出现编译错误。...所以使用通配符的话,这个集合作用就是使用Object类型来遍历。...那么如果可以保证添加一个元素,一定是类型子类,那么是不是可以添加元素了?这个问题就涉及到通配符上下限问题了。下章继续。 本章很多名称相同,但是内容不同,请在不同包下进行操作。

2.2K20

Java总结

程序设计意味着程序可以被不同类型对象重用,类似c++模版。 对于集合尤其有用,如ArrayList。...这里可能有疑问,既然为了适应不同对象,ArrayList本来就可以操作不同类型对象呀?那是因为没有之前采用继承机制实现,实际上只维护了一个Object对象数组。...>[10]; 不可以创建原因是:因为类型擦除原因无法在为元素赋值时类型检查,因此jdk强制不允许一个特例是方法可变参数,虽然本质上是数组,却可以使用。 安全方法是使用List。...public void setName2(String name) { System.out.println("son:" + name); } 继承参数化 一个类型参数不同,称之为不同参数化...一个原则:一个类型变量不可成为两个不同参数化接口类型类型

95420

Java学习和使用

Object类型;当我们执行get方法时候,同样不存在,也是被当做Object来返回; 可是,个疑问,在编译期由于存在,我们不需要显式进行类型转换,但是在运行期间是如何解决呢,难道不会报错吗...重载Overloading是一个中多态性一种表现,如果在一个中定义了多个同名方法,它们或有不同参数个数或有不同参数类型,则称为方法重载(Overloading)。...Overloaded方法是可以改变返回类型但同时参数列表也得不同。...;下面,让来进一步去分析: 子类TestChild继承了父Test,并传入变量String,如果忽略擦除存在,父Test代码应该变成这样: 意淫下 但实际上,Java在编译期已经将变量擦除...但实际上由于桥方法是在编译后class文件中生成,所以我们认为虚拟机是允许这样情况出现,JVM虚拟机认定方法唯一方式,不单通过方法名称和参数,还包括了方法返回值; 4.3 异常和擦除 自定义异常

1.5K40

Java JDK1.5: 新特性讲解说明

Collection,List,ArrayList 这个就是类型参数,即概述 所谓,就是允许在定义,接口时通过一个标识中某个属性类型或者时某个方法返回值以及参数类型。...这引入了类型变量 T,可以在任何地方(非静态方法,属性,参数,返回值)使用。把一个集合中内容限制为一个特定数据类型,这就是背后核心思想。...图片4.4 自定义结构方法方法 是引入自己类型参数方法。这与声明类型相似,但是类型参数作用域仅限于声明方法。允许使用静态和非静态方法,以及构造函数。...但是,在运行时只有一个 ArrayList 被加载到 JVM 中,因为一样,所存储类型不同而已,仅仅只会加载一次到i内存当中。简单说:就是不同不可以相互引用赋值 ,编译无法通过。...我们可以调用 get() 方法并使用其返回值。返回值是一个未知类型,但是我们知道,总是一个Object。

90500

重学Java基本使用

后面想到了擦除,但其实这跟擦除倒是没关系,问题出在自动装箱和拆箱上,Java编译器将原始类型转为包装,包装转为基本类型。...简单总结一下,引入好处,将类型当做参数,可以让开发者可以在不同输入使用相同代码,理解是,提升代码可复用性,在编译时执行更强类型检查,消除类型转换,用实现通用算法。...如何使用Hello World上面我们提到类型参数,那我们如何传递给一个类型呢,类似于方法,我们首先要声明形式参数,跟在名后面,放在里面,在里面我们可以声明接收几个类型参数,如下所示...和子类型我们可以实现或继承一个和接口,两个、接口之间关系由继承和实现语句决定。...号是特殊符号,专门含义。

34010

Java 学习笔记(10)——容器

Java中提供了另一种存储方式,就是用容器来处理这种需要动态添加或者删除元素情况 概述 Java中最常见容器一维和多维。单维容器主要是一个节点上存储一个数据。比如列表和Set。...使用迭代器可以操作元素本身,也可以根据当前元素寻找到下一个元素,常用方法: boolean hasNext() : 当前迭代器指向位置是否一个元素 E next(): 获取下一个元素并返回。...如果没有,我们需要将所有类型对应这些结构代码都重复写一遍。我们就能更加专注于算法实现,而不用考虑具体数据类型。 在定义时候,只需要使用 中包含表示字母即可。...常见: T 表示Type E 表示 Element 中可以使用任意标识符来表示,只要符合Java命名规则即可。...:想要使用,但是不希望传入任意类型值,只想要处理继承自某一个类型,就比如说只想保存那些实现了某个接口

67750

趣谈

Java带来了什么好处?规约。就像接口定义一样,可以帮助对于类型和对象使用上,保证类型正确性。...擦除 Java 在编译阶段实际上就已经被擦除了(这也是和 C#最本质区别),也就是说,对于使用定义,对于编译执行过程,并没有任何帮助(有谁能告诉为什么按着擦除来设计?)...仅仅靠类型不同来设计重载接口?那是痴人说梦。但是如果代码变成这样呢?...} } Wrapper 定义里面指定了包装了一个类型为 E 对象,但是在另一个使用它 Builder 里面,指定了 Wrapper 参数是?...但 Java 与 C++不同,C++对象没有公共父,不使用根本无法建立一个能存放所有类型容器,所以必须在费大力气在编译后运行代码中支持,保留信息自然是顺水推舟。

23020

【面试干货】Java面试真题助你击破BAT招聘套路!

重载和重写区别 重载:发生在同一个中,方法名必须相同。 参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。...12.什么是、为什么要使用以及擦除 ,即“参数化类型”。 创建集合时就指定集合元素类型,该集合只能保存其指定类型元素,避免使用强制类型转换。...Java编译器生成字节码是不包涵信息类型信息将在编译处理是被擦除,这个过程即类型擦除。...擦除可以简单理解为将java代码转换为普通java代码,只不过编译器更直接点,将java代码直接转换成普通java字节码。...类型擦除主要过程如下: 1)将所有的参数用其最左边界(最顶级类型类型替换。 2)移除所有的类型参数。 13.Java集合及关系图 List和Set继承自Collection接口。

71940

Java 示例 - 方法,,接口

Java 中具有集合非常容易,但是提供了比仅创建集合类型更多功能。 我们将在本文中尝试学习功能。如果我们使用专业术语,对理解有时会变得混乱,因此,将尽量保持其简单易懂。...这是一个显示Java方法示例。...Java和继承 我们知道,如果A是B子类,则Java继承允许我们将变量A分配给另一个变量B。因此,我们可能认为可以将A任何类型分配给B类型,但事实并非如此。...Java通用和子类型 我们可以通过扩展或实现来一个通用或接口。一个或接口类型参数与另一或接口类型参数之间关系由extend和实现子句确定。...9.1)Java上界通配符 上限通配符用于在方法中放宽对变量类型限制。假设我们要编写一个返回列表中数字总和方法,那么我们实现将是这样

2.6K50

Retrofit解析3之反射

Java反射机制,被称为Reflection。允许运行中Java程序对自身进行检测,并能直接操作程序内部属性或方法。...不仅语言、类型系统和编译器了较大变化,以支持,而且库也进行了大翻修,所以许多重要,比如集合框架,已经成为化,这带来很多好处: 类型安全:主要目标是提高Java程序类型安全。...这样会产生一些编译器警告和潜在运行时异常。 在使用带通配符时候,需要明确通配符所代表一组类型概念。由于具体类型是未知,很多操作是不允许最好不要和同数组一块使用。...此时,所有原始类型都通过字节码文件Class进行抽象。Class一个具体对象就代表一个指定原始类型出现之后类型 出现之后,扩充了数据类型。...2、Generic Method Return Type(方法返回类型) 如果你获得了java.lang.reflect.Method对象,你也是可能获得返回类型信息

1.2K20
领券