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

一文读懂《Effective Java》第23条:不要在新代码中使用原生态类型

泛型出现后,我们通过泛型可以告诉编译器每个集合可以接受哪些对象类型,让编译器自动为集合的元素插入进行转化,并且在编译时告知我们是否插入了类型错误的对象。...一些泛型的专业术语 泛型类或泛型接口:声明中具有一个或多个类型参数(type parameter)的类或者接口,统称为泛型。...eg,jdk1.5之后,List 接口只有单个类型参数E,表示列表的元素类型,所以他的接口名称应该是List,但是人们常常把它简称为List。...参数化的类型(parameterized type),构成格式是:类或接口的名称 + 尖括号()将泛型形式参数的实际类型参数列表括起来。...泛型:编译期及早发现错误 使用泛型进行编码,有两个好处: 优点1:让编写代码时在编译期及早发现错误,并且助于定位报错位置 优点2:集合使用泛型,从集合中遍历元素时不需要再进行手工转换了(编译器替我们完成隐式转换

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

    Go 中的泛型:激动人心的突破

    泛型让我们能在定义接口、函数、结构时参数化类型。泛型不是什么新概念。...速度,我要的是速度 Go 中的泛型与反射是不一样的。在讲一些复杂的例子之前,我们有必要先检查一下泛型的基准测试分数。从逻辑上讲,我们并不指望它的性能接近反射,因为在这种情况下我们不需要泛型。...当然,泛型并不像反射,它也没打算做成那样。不过至少在某些用例中,泛型是生成代码的一种替代方法。 因此,这意味着我们想看到的是基于泛型的代码与“经典”执行的代码具有相同的基准测试结果。...在这个示例中,我们不应将 interface{}视为一种类型,而应将其视为一种约束。我们使用约束来为我们的参数化类型定义规则,并为 Go 编译器提供一些关于期望的背景知识。...我们定义了一个 Greeter 接口,以便将它用作 Greetings 方法中的约束。不是为了演示的话,这里我们可以直接使用 Greeter 类型的变量而不是泛型。

    48850

    java泛型理解

    在集合中使用泛型  自定义泛型结构  自定义泛型结构:泛型类、泛型接口 1. 泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如: 2....实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。 4. 泛型不同的引用不能相互赋值。...如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象。...在类 / 接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态 属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在 静态方法 中不能使用类的泛型。 10....父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型: 子类不保留父类的泛型:按需实现 没有类型 擦除 具体类型 子类保留父类的泛型:泛型子类 全部保留

    26020

    Java 编程思想第十二章 - 容器持有对象

    文章目录 1 泛型和类型安全的集合 泛型下的向上转型 2 基本概念 3 添加元素组 4 打印集合 默认的打印 5 List 6 迭代器Iterators ListIterator 链表LinkedList...使用 Java 泛型来创建类可能很复杂。但是,使用预先定义的泛型类却相当简单。...好处 使用泛型,从 List 中获取元素无需强制类型转换。因为 List 知道自己持有的啥类型,因此当调用 get() 时,它会替你执行转型。...泛型下的向上转型 当指定了某个类型为泛型参数时,并不仅限于只能将确切类型的对象放入集合中。 向上转型也可以像作用于其他类型一样作用于泛型: ? ?...是否永远不应该在 ArrayList 的中间插入元素,并最好转换为 LinkedList ?

    1.4K20

    Java8编程思想精粹(十)-容器(上)

    使用 Java 泛型来创建类可能很复杂。但是,使用预先定义的泛型类却相当简单。...通过使用泛型,就可以在编译期防止将错误类型的对象放置到集合中。 泛型版本示例 ? new ArrayList() ,“菱形语法”(diamond syntax)。...好处 使用泛型,从 List 中获取元素无需强制类型转换。 因为 List 知道自己持有的啥类型,因此当调用 get() 时,它会替你执行转型。...因此,使用泛型,你不仅知道编译器将检查放入集合的对象类型,而且在使用集合中的对象时也可以获得更清晰的语法。 泛型下的向上转型 当指定了某个类型为泛型参数时,并不仅限于只能将确切类型的对象放入集合中。...是否永远不应该在 ArrayList 的中间插入元素,并最好转换为 LinkedList ?

    1.3K41

    JAVASE经典面试问题(必须熟背),你Get到了吗?

    使用break label; 在java中,使用break可以跳出循环,默认情况下是跳出最里层的循环,假如我们要跳出多层循环怎么办呢,Java替我们已经做好了这一点,就是用循环标签 :即是对某个循环定义一个名字...两种方式:继承Thread类、实现Runnable接口 14. 什么是泛型?使用泛型有什么好处? 泛型是约束集合的各种数据类型的一种机制。...使用泛型的好处是规定集合里存放的数据类型,提高使用集合的安全性和健壮性、方便集合遍历。 15. ==与equals究竟有什么区别?...==:判断两个对象是否相等 equals:判断两个对象的内容是否相等。 16. Integer与int有什么区别? Integer:是int类型的封装类型,是引用类型,指向一个对象。...finally语句块里的代码无论是否抛出异常,一定会被执行。 finalize:是Object类的一个方法,销毁一个对象前会默认调用这个对象的finalize()方法。

    76430

    Java 语言基础 (常用类的概述和使用, String 类的概述和使用, 可变字符串类和日期相关类, 集合类库)

    Date parse(String source)用于将文本类型转换为日期类型 Calendar 类的概述 通过方法的参数传递形成多态; public static void draw(Shape s)...;List lt2 = ...; 自定义泛型接口 泛型接口和普通接口的区别就是后面添加了类型参数列表,可以有多个类型参数,如: 等。...如果子类没有保留父类泛型 T 且没有指定泛型,则父类的泛型 T 默认为 Object 类型。 子类除了指定或保留父类的泛型,还可以增加自己的泛型。...自定义泛型方法 泛型方法就是我们输入参数的时候,输入的是泛型参数,而不是具体的参数。我们在调用这个泛型方法的时需要对泛型参数进行实例化。...如果 B 是 A 的一个子类或子接口,而 G 是具有泛型声明的类或接口,则 G 并不是 G 的子类型。

    1K30

    Java基础(二十):泛型

    这里的T,可以替换成K,V等任意字母 声明类或接口时,在类名或接口名后面声明泛型类型,我们把这样的类或接口称为泛型类或泛型接口 【修饰符】 class 类名 【extends 父类】...当我们在类或接口中定义某个成员时,该成员的相关类型是不确定的 而这个类型需要在使用这个类或接口时才可以确定,那么我们可以使用泛型类、泛型接口 2.1、说明 我们在声明完自定义泛型类以后,可以在类的内部...我们还可以在现有的父类的泛型参数的基础上,新增泛型参数 2.2、注意 泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。...接口上声明的泛型,在本类或本接口中即代表某种类型,但不可以在静态方法中使用类的泛型 静态方法需要在类加载初始化默认值,类泛型在创建对象时候才能确定类型,所以自洽 异常类不能是带泛型的 举例1: class...参数名称]) [抛出的异常]{ } 方法,也可以被泛型化,与其所在的类是否是泛型类没有关系 泛型方法中的泛型参数在方法被调用时确定 泛型方法可以根据需要,声明为static的 举例1: public

    13810

    C# 学习笔记(15)—— C# 4.0

    那么,泛型中的泛型参数是否也支持这样的转换呢?...C# 2.0 确实是不支持的,但因为有了这样的需求,微软便适应地做出了改进,在 C# 4.0 中引入了泛型的协变性和逆变性 协变性 协变性指的是泛型类型参数可以从一个派生类隐式地转换为基类 C# 4.0...引入out关键字来标注泛型参数,以示支持协变性,为了更好的说明,下面使用 .Net 类库中的public interface IEnumerable接口为例,做泛型协变性的演示: class...,反之则失败 逆变性 逆变性是指泛型类型参数可以从一个基类隐式地转换为派生类,C# 4.0 引入in关键字来标记泛型参数,以示其支持逆变性,下面以 .Net 类库中的接口public interface...由于IComparer接口泛型参数只支持逆变,不支持协变,所以不能把IComparer类型隐式地转换为IComparer,所以会出现编译错误 协变和逆变的注意事项

    25820

    过去、现在和未来 —— Java 的现代化之路

    通俗的来讲,任意一个仅有一个抽象方法的接口,都是函数式接口(无论其是否标注 @FunctionalInterface 注解),例如我们上边看到的 Thread 构造方法中的 Runnable 接口: @...我们可以为需要函数式接口实例的地方传入 Lambda 表达式,在运行时,Lambda 表达式会被转换为对应函数式接口的实例,就像我们为 Thread 传入构造函数参数所做的那样一样。...,然而后者并不被 Java 泛型所支持,因为 Java 泛型采用的方案于 C++, Go, Rust 这些语言的泛型方案有本质不同:Java 的泛型只是编译器语法糖,在运行时并没有影响代码执行,这意味着...泛化泛型和具化泛型的争端从未停止,本文也无心讨论此两者之间各自的优劣,但是不可否认是,泛化泛型确实为 Java 引入了一个难以逾越的语法鸿沟:那就是参数化类型无法接受基本数据类型作为参数,这意味着在 C...而通用泛型(这是一个早前叫法,但我觉得放到这里更直观,所以接着沿用下来)将允许我们在未来在泛型中直接使用基本数据类型作为泛型参数,而这种实现有可能依然是通过自动拆装箱实现的。

    21710

    编写高质量代码改善C#程序的157个建议

    前言   泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能。基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确保了类型安全。...本文主要学习记录以下内容:   建议32、总是优先考虑泛型   建议33、避免在泛型类型中声明静态成员   建议34、为泛型参数设定约束 建议32、总是优先考虑泛型   泛型的优点是多方面的,无论是泛型类还是泛型方法都同时具备可重用性...建议33、避免在泛型类型中声明静态成员  在上一个建议中,已经解释了应该将MyList 和MyList 视作两个完全不同的类型,所以,不应将MyList中的静态成员理解成为...5、指定参数必须是指定的接口、或者实现指定的接口。 6、指定T提供的类型参数必须是为U提供的参数,或者派生自为U提供的参数。...——是否可建议一间较为廉价的旅馆? 3、Is there an airport bus to the city?——是否有机场巴士可到市区?

    62120

    Kotlin 泛型:类型参数约束

    上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。本篇是 Kotlin 泛型类型参数约束的讲解,更多内容可点击链接查看。...Kotlin 泛型:基本使用Kotlin 泛型:类型参数约束系列持续更新中,欢迎关注订阅。...为什么需要类型参数约束在上一篇文章里,我们使用泛型定义了一个泛型列表List,使用这个列表,我们可以在使用的时候,实例化出各种具体类型的列表,比如字符串列表List、整型列表List...interface List { // 泛型接口 fun set(index: Int, obj: T) // 用于方法,下同 fun get(index: Int): T?}...我们使用泛型类来实现打印机Printer,显然这个类型参数需要满足两个条件:T必须实现Printable接口T必须实现Serializable接口这两个条件无法用前一节的简单类型参数约束来表达,因此

    2.3K31

    Java高级特性之泛型

    泛型指代一种参数类型,可以声明在类、方法和接口上。...: 编译期间编译器检查传入的泛型类型与声明的泛型类型是否匹配,不匹配则报出编译器错误; 编译器执行类型擦除,字节码内只保留其原始类型; 运行期间,再将 Object 转换为所需要的泛型类型。...也就是说:Java 的泛型实际上是由编译器实现的,将泛型类型转换为 Object 类型,在运行期间再进行状态转换。...如果有参数类型相关的逻辑,那么就需要考虑这些逻辑是否已有共同的接口实现,如果已有共同的接口实现,可以使用边界限定通配符。...如果还没有共同的接口,那么需要考虑是否可以抽象出一个通用的接口实现,如打印人类的衣服颜色和动物的毛皮颜色,就可以抽象出一个 getColor() 接口,抽象之后再使用边界限定通配符。

    76240
    领券