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

掌握8条泛型规则,打造优雅通用的Java代码

掌握8条泛型规则,打造优雅通用的Java代码在Java开发中泛型以类型安全和代码复用的特性扮演着关键角色掌握好泛型能够确保类型安全、提升代码复用、降低维护成本,打造出优雅通用的代码本文基于 Effective...Java 泛型章节汇总出8条泛型相关习惯不要使用原生态类型在早期的JDK中,从集合中获取对象时都需要强制转换如果在添加对象时,不小心将不同类型的对象加入集合,那么获取对象强制转换时会发生报错这种报错并不会在编译期间提示...:安全(提早报错)、灵活(不需要手动强转)当无法预估集合中对象的类型时,可以使用泛型Object或无限制通配符如果使用泛型Object则可以存放任何对象,因为Object是所有类的父类但是对象从集合中取出时,只能转换为Object,如果需要转换为其他类型则还是需要强制转换 List...,写数据相当于消费外界传入的数据泛型和可变参数谨慎同时使用可变参数是一种语法糖,实际上会转换为数组当泛型与可变参数同时使用时,实际上可以理解为泛型数组但是JDK允许这么使用,在很多JDK方法中也会这么去使用

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

    Kotlin 1.2 的新增特性

    如果调用一个返回类型参数 T 并将返回值转换为特定类型 Foo 的泛型方法,则编译器现在可以理解此调用的 T 需要绑定到 Foo 类型。...弃用:数据类的覆写性拷贝 当从已经具有相同签名的拷贝函数的类型派生数据类时,为数据类生成的 copy 实现使用父类型的默认函数,会导致出现与预期相反的行为,如果父类型没有默认参数,则在运行时失败 导致复制冲突的继承已经被...弃用:扩展 Throwable 的泛型类的内部类 继承自 Throwable 的泛型的内部类可能会违反 throw-catch 场景中的类型安全性,因此已被弃用,在 Kotlin 1.2 中会被警告,在...来改变只读属性的 backing 字段已被弃用,在 Kotlin 1.2 中会被警告,在 Kotlin 1.3 中将会报错。...工具 将警告视为错误 编译器现在提供了将所有警告视为错误的选项。在命令行中使用 -Werror,或使用以下的 Gradle 代码:

    2.8K70

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

    2.因此,从List取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。...泛型思想早在C++语言的模板(Template)中就开始生根发芽,在Java语言处于还没有出现泛型的版本时,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化。...Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的Java...将一段Java代码编译成Class文件,然后再用字节码反编译工具进行反编译后,将会发现泛型都不见了,程序又变回了Java泛型出现之前的写法,泛型类型都变回了原生类型 public static String...所以不是在get方法里强转的,是在你调用的地方强转的 kotlin泛型 kotlin泛型中引入了in和out Out (协变) 如果你的类是将泛型作为内部方法的返回,那么可以用 out: interface

    1.1K00

    看了这篇泛型,下次设计链表别傻傻的用int 表示node节点的值了

    允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。...泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。 ——百度百科 没有泛型的时候 泛型,从字面的意思来看,广泛的意思,能够广泛的代表或者处理某一类事务的类型(java集合类)。...就是在第二次显示的向下转向的时候,如果人为转换错误编译器无法识别,而必须等到代码执行时候才报错,这样的机制让java代码变得不太安全。 ?...Java泛型 在Object显示转换存在不安全行为的情况下,Java在jdk1.5以后提出了泛型机制,通过泛型就能有效避免转型时候出现的问题,泛型简单的理解就是在类、接口、方法中定义未知类型变量,只有初始化的时候才知道真正的类型...不过泛型更多的应用于框架的编写方面,在java中其实也是随处可见。尤其是集合类: ? 看了这篇泛型,下次设计链表二叉树别傻傻的用int 表示node节点的值了!我想你该知道正确的写法了!

    51520

    Java 中文官方教程 2022 版(六)

    然而,运行时错误可能会更加棘手;它们并不总是立即显现,而且当它们出现时,可能是在程序中与问题实际原因相距甚远的地方。 泛型通过在编译时使更多的错误可检测,为你的代码增加了稳定性。...使用泛型的代码比不使用泛型的代码有许多好处: 编译时进行更强的类型检查。 Java 编译器对泛型代码应用强类型检查,如果代码违反类型安全性,则会发出错误。...但是,非泛型类或接口类型不是原始类型。 在旧代码中会出现原始类型,因为在 JDK 5.0 之前,许多 API 类(如Collections类)都不是泛型的。...这类似于声明一个泛型类型,但类型参数的范围仅限于声明它的方法。允许静态和非静态泛型方法,以及泛型类构造方法。 泛型方法的语法包括一个类型参数列表,在方法返回类型之前出现在尖括号内。...通配符可以在各种情况下使用:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体的编程实践更好)。 通配符永远不会用作泛型方法调用、泛型类实例创建或超类型的类型参数。

    20000

    详解 Java 泛型

    到现在,泛型已经成为 Java 里面最常使用的特性之一了。不管是各种 Java 集合类,还是一些开源库里面都能见到泛型的身影,如果我们使用得当,泛型可以大幅简化我们的代码。...该字段类型为 java/lang/Object,即为 Object 类,也就是说 我们设置的泛型其实并没有实际应用到具体的类字段中去!...这其实就是我们常听到的泛型擦除:泛型类在还没被使用到时中并不知道字段的实际的类型是什么,于是用了一个所有类的基类:java.lang.Object 类型的引用来承接实际值。...其二,在声明和使用泛型的类和方法中,在 class 文件层面,需要有一个额外的表结构来记录存在泛型参数时的类和方法签名,这个表名为 Signature,是虚拟机规范定义的 class 文件中类、方法、字段可能存在...在字节码层,main 方法中出现了类型强制转换的字节码(checkcast)!

    93420

    带你深挖Java泛型类型擦除以及类型擦除带来的问题

    Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法在运行时刻出现的类型转换异常的情况,类型擦除也是Java的泛型与C++模板机制实现方式之间的重要区别。...要区分原始类型和泛型变量的类型。 在调用泛型方法时,可以指定泛型,也可以不指定泛型。...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...可是,这样做有什么意义呢,泛型出现的原因,就是为了解决类型转换的问题。 我们使用了泛型,到头来,还是要自己强转,违背了泛型设计的初衷。所以java不允许这么干。...那么,运行时进行类型查询的时候使用下面的方法是错误的 if( arrayList instanceof ArrayList) 3-6.泛型在静态方法和静态类中的问题 泛型类中的静态方法和静态变量不可以使用泛型类所声明的泛型类型参数

    1.7K40

    带你深挖Java泛型类型擦除以及类型擦除带来的问题

    Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法在运行时刻出现的类型转换异常的情况,类型擦除也是Java的泛型与C++模板机制实现方式之间的重要区别。...要区分原始类型和泛型变量的类型。 在调用泛型方法时,可以指定泛型,也可以不指定泛型。...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...可是,这样做有什么意义呢,泛型出现的原因,就是为了解决类型转换的问题。 我们使用了泛型,到头来,还是要自己强转,违背了泛型设计的初衷。所以java不允许这么干。...那么,运行时进行类型查询的时候使用下面的方法是错误的 if( arrayList instanceof ArrayList) 3-6.泛型在静态方法和静态类中的问题 泛型类中的静态方法和静态变量不可以使用泛型类所声明的泛型类型参数

    3.9K21

    Java进阶-集合(3)与泛型

    ,能保存任何类型的对象(因为Object类是所有类的父类,即创建对象时都能向上转型,不用强转) 1.2 问题(若无泛型) 1)集合对元素类型没有任何限制,如想创建一个只保存 Dog 对象的集合,但程序也可以轻易地将...属性声明:如private data_type1 property_name1; 一般用于类中的属性类型不确定的情况下 在实例化泛型类时,需要指明泛型类中的类型参数,并赋予泛型类属性相应类型的值...("学生姓名:"+name+" 年龄:"+age+" 性别:"+sex); } } 5、泛型方法 5.1 注意与说明 泛型可以在类中包含参数化的方法,而方法所在的类可以是泛型类,也可以不是泛型类...编程",20); List(b); //调用List泛型方法 } } //result //1 java编程 20 6、泛型高级用法 除在集合、类和方法中使用,泛型还有如下高级用法...6.1 限制泛型可用类型 语法:class 类名称,anyClass指某个接口或类,使用泛型限制后,泛型类的类型必须实现或继承 anyClass 这个接口或类,且在进行泛型限制时必须使用 extends

    28821

    Scala:样例类、模式匹配、Option、偏函数、泛型(三)

    说明程序出现错误后就终止了。 那怎么解决该问题呢?...:异常类型2 => // 代码 } finally { // 代码 } try中的代码是我们编写的业务处理代码 在catch中表示当出现某个异常时,需要执行的代码 在finally中,是不管是否出现异常都会执行的代码...泛型 scala和Java一样,类和特质、方法都可以支持泛型。我们在学习集合的时候,一般都会涉及到泛型。...示例 示例说明 实现一个Pair泛型类 Pair类包含两个字段,而且两个字段的类型不固定 创建不同类型泛型类对象,并打印 参考代码 case class Pair[T](var a:T, var b:.../类的泛型时,限定必须从哪个类继承、或者必须是哪个类的父类。

    2.4K20

    泛型(泛型擦除)【java基础—-泛型】

    1.3 泛型定义(泛型类、泛型方法(泛型方法返回值是泛型的,泛型方法在普通类和泛型类里)): 1.4特点: 对于泛型特点(1)举个例子 : 没有使用泛型时的异常抛出 对于泛型特点(2)访问时不需要类型转换...不能存储基本类型int,double… 5.泛型擦除 5.1 泛型擦除概念: 5.2 由于泛型擦除出现的错误举例: ---- ---- 1.什么是泛型 1.1泛型概念: Java泛型是J2 SE1.5...我们在使用 list.add() 方法时,根据提示知道凡是Object对象都可以添加进去,但是要使用的时候忘了添加过什么类型的对象进去,根据提示强转过,但是由于添加进去一些类型不同的,强转可以在编译时通过...(也可以加上泛型特点(1)(2)) 3.2泛型类的好处 答:使用泛型类可以解决重复业务的代码的复用问题,也就是业务颗粒的复用,同时使用泛型类型在编译阶段就可以确定,并发现错误,类型的转换都是自动和隐式的...5.2 由于泛型擦除出现的错误举例: 报错原因:Erasure of method MyGeneric(ArrayList) is the same as another method

    2.6K51

    Java泛型深入理解「建议收藏」

    通过继承设计通用程序 在Java增加泛型类型之前,通用程序的设计就是利用继承实现的,例如,ArrayList类只维护一个Object引用的数组,Object为所有类基类。...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...可是,这样做有什么意义呢,泛型出现的原因,就是为了解决类型转换的问题。我们使用了泛型,到头来,还是要自己强转,违背了泛型设计的初衷。所以java不允许这么干。...,在泛型方法中使用的T是自己在方法中定义的T,而不是泛型类中的T。...泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。

    84020

    【Java 基础 - 泛型机制详细解释】

    擦除类定义中的类型参数 - 无限制类型擦除 当类定义中的类型参数没有任何限制时,在类型擦除中直接被替换为Object,即形如和的类型参数都被替换为Object。...擦除类定义中的类型参数 - 有限制类型擦除 当类定义中的类型参数存在限制(上下界)时,在类型擦除中替换为类型参数的上界或者下界,比如形如和在调用泛型方法时,可以指定泛型,也可以不指定泛型: 在不指定泛型的情况下,泛型变量的类型为该方法中的几种类型的同一父类的最小级,直到Object 在指定泛型的情况下,该方法的几种类型必须是该泛型的实例的类型或者其子类...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...可是,这样做有什么意义呢,泛型出现的原因,就是为了解决类型转换的问题。 我们使用了泛型,到头来,还是要自己强转,违背了泛型设计的初衷。所以java不允许这么干。

    53810

    Java泛型

    :Apple a = (Apple) b.get(); // 强转,可能出现ClassCastException这就是类型不安全,一旦强转错了类型,程序就GG了。...候选人: 好的,两个很好的疑问:1)泛型类不能有静态方法的原因是因为静态方法在类加载的时候就被创建,而泛型类在实例化的时候才能确定类型参数的实际类型。...因为Java在1.5之前并没有泛型的概念,所以编译器会把所有的泛型类型全部擦除掉,在运行时期间不会存在任何泛型类型的参数信息。这也是为什么泛型类不能有基本类型的参数的原因。...泛型方法和泛型类有什么区别?泛型方法是在普通类中定义带类型参数的方法,而泛型类是在定义类本身时指定类型参数。...泛型方法更灵活,可以在非泛型类上使用。除此之外,泛型方法可以有static修饰符,可以在静态方法内使用类型参数。而泛型类不能有静态方法和静态属性,原因和前面说的类型擦除有关。3. 泛型的上下限是什么?

    18030

    《面试1v1》Java泛型

    :Apple a = (Apple) b.get(); // 强转,可能出现ClassCastException这就是类型不安全,一旦强转错了类型,程序就GG了。...候选人: 好的,两个很好的疑问:1)泛型类不能有静态方法的原因是因为静态方法在类加载的时候就被创建,而泛型类在实例化的时候才能确定类型参数的实际类型。...因为Java在1.5之前并没有泛型的概念,所以编译器会把所有的泛型类型全部擦除掉,在运行时期间不会存在任何泛型类型的参数信息。这也是为什么泛型类不能有基本类型的参数的原因。...泛型方法和泛型类有什么区别?泛型方法是在普通类中定义带类型参数的方法,而泛型类是在定义类本身时指定类型参数。...泛型方法更灵活,可以在非泛型类上使用。除此之外,泛型方法可以有static修饰符,可以在静态方法内使用类型参数。而泛型类不能有静态方法和静态属性,原因和前面说的类型擦除有关。3. 泛型的上下限是什么?

    19730

    Java 泛型:概念、语法和应用

    Java 泛型(Java Generic)是一种编程技术,它允许程序员在编写 Java 类、接口和方法时定义泛型类型参数,这些类型参数可以在代码中表示不同的类型,使得代码变得更加通用、可重用和类型安全。...Java 泛型还提供了运行时类型检查机制,可以在运行时捕获类型错误,从而避免出现类型转换异常等常见问题。...myGenericInt,并且在实例化类对象时将类型参数 T 替换为具体类型 Integer。...四、Java 泛型的应用 Java 泛型可以应用于类、接口、方法等各种代码块中,下面我们将逐一介绍这些用法。 1. 类泛型 类泛型就是在定义一个类时,在其中定义一个包含泛型类型参数的变量。...② 在实例化集合类时,可以指明具体的泛型类型 ③ 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。

    23220
    领券