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

流畅的 Python 第二版(GPT 重译)(八)

本章的其余部分涵盖了泛型,从如何定义一个可以由用户参数化的泛型类开始。 实现一个通用类 在 示例 13-7 中,我们定义了Tombola ABC:一个类似于宾果笼的接口。...提示 typing模块文档中的“用户定义的泛型类型”部分很简短,提供了很好的例子,并提供了一些我这里没有涵盖的更多细节。 现在我们已经看到如何实现泛型类,让我们定义术语来谈论泛型。...泛型类型的基本术语 这里有几个我在学习泛型时发现有用的定义:¹⁴ 泛型类型 声明有一个或多个类型变量的类型。...我们首次在“可调用类型的方差”中看到了方差的概念,应用于参数化泛型Callable类型。在这里,我们将扩展这个概念,涵盖泛型集合类型,使用“现实世界”的类比使这个抽象概念更具体。...最后几节是关于泛型的,首先是LottoBlower泛型类——我们后来了解到它是一个不变的泛型类。该示例后面是四个基本术语的定义:泛型类型、形式类型参数、参数化类型和实际类型参数。

24210

流畅的 Python 第二版(GPT 重译)(四)

类 当调用一个类时,它运行其 __new__ 方法来创建一个实例,然后运行 __init__ 来初始化它,最后将实例返回给调用者。...例如,具有 typecode='B' 的 array 只能容纳从 0 到 255 的 int 值。目前,Python 的静态类型系统还无法应对这一挑战。 现在让我们看看如何注释泛型元组。...相应的 typing 集合仅需要支持在 Python 3.8 或更早版本中编写的代码。变成泛型的类的完整列表出现在 “实现” 部分的 PEP 585—标准集合中的类型提示泛型 中。...参数化泛型和 TypeVar 参数化泛型是一种泛型类型,写作 list[T],其中 T 是一个类型变量,将在每次使用时绑定到特定类型。这允许参数类型反映在结果类型上。...提示 目前,可以放心地说,大多数参数化的泛型类型是invariant,因此更简单。例如,如果我声明scores: list[float],那告诉我可以分配给scores的对象。

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

    Java 泛型在哪些情况下无法使用

    基本类型无法直接使用泛型 以下写法是错误的: // error Map wrong= new HashMap() 基本类型是不能够作为泛型类型的,需要使用它们对应的包装类。...泛型类型无法被直接实例化 泛型类型可以理解为一个抽象类型,只是代表了类型的抽象,因此我们不能直接实例化它,下面的做法也是错误的: public E first(List list){...泛型无法作为静态变量类型 Java 中的静态类型随着类加载而实例化,此时泛型的具体类型并没有声明。同时因为静态变量作为所有对象的共享变量,只有类实例化或者方法调用时才能确定其类型。...同样在类上声明的泛型也无法作为返回值类型出现在类的静态方法中,下面的写法也是错误的: public class Generic{ // 不能将类声明的泛型类型作为静态变量 public...无法创建参数化类型的数组 首先下面这种写法是对的: // OK List[] arrayOfLists = new List[2]; 但是加上了泛型就编译不通过了: //error List<Integer

    1K50

    Effective-java-读书笔记之泛型

    第26条 不要使用原生态类型类或接口的声明中如果有类型参数, 就是泛型类或泛型接口, 统称泛型.比如List接口.每个泛型都定义一个原生态类型(raw type), 即不带任何实际类型参数的泛型名称...要是无法接受这些限制, 可以使用泛型方法(见30条)或者有限制的通配符类型(见31条).不要在新代码中使用原生态类型, 有两个小小的例外:在类文字(class literal)中必须使用原生态类型....E[], 这样可能会损失一些简洁性, 但是换回的却是更高的类型安全性和互用性.第29条 优先考虑泛型举了一个堆栈实现的例子, 开始是用Object类型.将这个类泛型化:给它的声明加类型参数.用类型参数替换所有的...注意: 每个类型都是它自身的子类型.第30条 优先考虑泛型方法就如类可以从泛型中受益一般, 方法也一样.静态工具方法尤其适合于泛型化.声明类型参数的参数列表位于方法修饰符和返回值类型之间.泛型方法的一个显著特性是...type所表示的类型的实例. java.util.Collections中有一些集合包装类采用了同样的技巧.

    44560

    Java泛型的局限和使用经验泛型的局限泛型的常用经验参考资料

    由于Java的泛型是编译期泛型(在进入运行时后没有泛型的概念),因此运行时的类型转换和类型判定等操作都没有效果。...不能在类型参数上使用instanceof操作, instanceof右边必须是某个原生类型或数组 if (args instanceof T) {} //(2)不能直接实例化类型参数...static关键字,然后引发编译错误的原因就变成了:在静态域中无法引用类型变量(入下图所示)。...,可以使用@SuppressWarnings("unchecked")屏蔽掉异常; 能用泛型类(或接口)的时候尽量使用;能用泛型方法的时候尽量使用泛型方法; 定义API时,尽量使用泛型; public...,尽量使用泛型; 例子1:通用的返回值对象 //使用泛型类 @Data @Builder @AllArgsConstructor @NoArgsConstructor public class DataListPageInfo

    85320

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

    Java SE 7 之前的编译器能够推断泛型构造函数的实际类型参数,类似于泛型方法。然而,在 Java SE 7 及更高版本中,如果使用菱形(),编译器可以推断正在实例化的泛型类的实际类型参数。...这包括原始类型、非泛型类型、原始类型和未绑定通配符的调用。 非可实例化类型 是在编译时通过类型擦除删除了信息的类型 —— 未定义为未限定通配符的泛型类型的调用。非可实例化类型在运行时不具备所有信息。...要有效地使用 Java 泛型,您必须考虑以下限制: 不能用原始类型实例化泛型类型。 不能创建类型参数的实例。 不能声明其类型为类型参数的静态字段。...不能用原始类型实例化泛型类型。...如果允许参数化列表的数组,上述代码将无法抛出期望的ArrayStoreException。 无法创建、捕获或抛出参数化类型的对象 一个泛型类不能直接或间接地扩展Throwable类。

    20000

    【Java基础】Java中泛型的使用

    本篇目录 1- 泛型是什么 2- 泛型的作用 3- 泛型的定义 4- 泛型的使用 1 泛型是什么 如下代码是一个使用了泛型的实体类,E表示这里类型使用的了泛型,意思是可以为任意类型,也包括引用数据类型...在使用类型参数后,编译器就可以检测提供的数据类型是否错误,使程序具有更好的可读性和安全性。...4 泛型的使用 定义了泛型后,可在类中代码中即可使用该字母作为数据类型来定义变量。...Test t=new Test(); 现在我对它进行了初始化,将泛型E赋予了String类型,所以现在类中的test变量就是String类型。...没错,Java的很多地方都大规模的使用了泛型,接触最多就是集合框架中泛型,如: List list=new ArrayList(); 这是我们在初始化一个ArrayList实例对象,

    55420

    Java - 泛型

    T getT2(T t) { return t; } } 泛型是在类实例化或者方法调用时才明确类型的: ● 对于泛型类的泛型参数,需要在类实例化时才能明确类型; ● 对于泛型方法的泛型参数...由于泛型擦除的原因,虽然无法在运行期通过反射动态获取一个泛型类的实际类型,但依然可以用反射来获取参数化类型的泛型信息。注意,泛型类和参数化类型不是一个东西。...泛型数组 跟前面的泛型集合特性一样,只是把泛型集合塞到一个数组中而已。但不同的是,无法实例化一个参数化类型的数组对象,但可以实例化一个通配符类型的数组对象。...the type E } 泛型类的泛型参数不能作为静态变量,也不能作为静态方法的返回值 泛型类在类实例化时才明确类型,而静态类型是在类加载时就初始化的,此时对于泛型类是无法明确泛型的具体类型的,所以泛型类的泛型参数不能作为静态变量...也就是说,泛型类的泛型参数默认就是非静态的。 但是,对于泛型方法,则可以被定义为静态的。原因是泛型方法在方法调用时明确类型,与类实例化无关,所以允许定义为静态的。

    57520

    java 泛型全解 - 绝对最详细

    背景 对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。...复制代码 泛型的思想很早就存在,如C++中的模板(Templates)。模板的精神:参数化类型 1.2 基本概述 泛型的本质就是"参数化类型"。...一提到参数,最熟悉的就是定义方法的时候需要形参,调用方法的时候,需要传递实参。那"参数化类型"就是将原来具体的类型参数化 泛型的出现避免了强转的操作,在编译器完成类型转化,也就避免了运行的错误。...'K' cannot be instantiated directly }复制代码 5.3 对静态成员的限制 静态方法无法访问类上定义的泛型;如果静态方法操作的类型不确定,必须要将泛型定义在方法上。...public class User { private T[] values; public User(T[] values) { //错误,不能实例化元素类型为类型参数的数组

    4K20

    Java泛型

    而实际类型参数Apple是在实例化Box时实际替换类型参数T的类型。它给T一个明确的类型,用于这次实例化。所以类型参数是个未知的类型占位符,实际类型参数是替换类型参数的具体类型。...理解了这两个概念的区别,泛型的很多地方就不会再混淆了。面试官:说的太好了,我都不好意思问你其他的了!那最后两点疑问,1)为啥泛型类不能有静态方法?...候选人: 好的,两个很好的疑问:1)泛型类不能有静态方法的原因是因为静态方法在类加载的时候就被创建,而泛型类在实例化的时候才能确定类型参数的实际类型。...泛型方法和泛型类有什么区别?泛型方法是在普通类中定义带类型参数的方法,而泛型类是在定义类本身时指定类型参数。...泛型方法更灵活,可以在非泛型类上使用。除此之外,泛型方法可以有static修饰符,可以在静态方法内使用类型参数。而泛型类不能有静态方法和静态属性,原因和前面说的类型擦除有关。3. 泛型的上下限是什么?

    18030

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

    图片泛型不可以作为实例化对象出现,因为泛型是在实例化的时候才确定该泛型具体的类型是什么的,如果直接对泛型实例化,你都不知道实例化成什么类型的对象的。 所以直接编译无法通过。...如下:图片4.3.1 含有泛型的类实例化对象带有泛型的实例化:一定要在类名/接口后面指定类型参数的值(类型)。...但是单独实例化父类还是要指明其泛型的具体类型的。...使用包装类图片注意:泛型不可以无法创建类型参数的实例 E new () 不可以 编译无法通过图片注意:不能声明类型是类型参数的静态字段/静态方法中(编译无法通过),但是可以创建静态泛型方法。...因为泛型是实例化对象的时候才确定其指明具体类型,而 静态是在实例化之前的操作。静态泛型方法是:在调用静态泛型方法的时候泛型才确定指明具体类型的。所以没问题。

    95000

    《面试1v1》Java泛型

    而实际类型参数Apple是在实例化Box时实际替换类型参数T的类型。它给T一个明确的类型,用于这次实例化。所以类型参数是个未知的类型占位符,实际类型参数是替换类型参数的具体类型。...理解了这两个概念的区别,泛型的很多地方就不会再混淆了。面试官:说的太好了,我都不好意思问你其他的了!那最后两点疑问,1)为啥泛型类不能有静态方法?...候选人: 好的,两个很好的疑问:1)泛型类不能有静态方法的原因是因为静态方法在类加载的时候就被创建,而泛型类在实例化的时候才能确定类型参数的实际类型。...泛型方法和泛型类有什么区别?泛型方法是在普通类中定义带类型参数的方法,而泛型类是在定义类本身时指定类型参数。...泛型方法更灵活,可以在非泛型类上使用。除此之外,泛型方法可以有static修饰符,可以在静态方法内使用类型参数。而泛型类不能有静态方法和静态属性,原因和前面说的类型擦除有关。3. 泛型的上下限是什么?

    19730

    kotlin入门之泛型

    泛型 将具体的类型泛化,编码的时候用符号来值代类型,在使用时再确定他的类型。 因为泛型的存在,我们可以省去强制类型转化。 泛型是跟类型相关的,那么是不是也能使用与类型的多态呢?...对于前者,显然我们要添加TextView是不可以的 实际情况是编译器无法确定到底属于那一种。无法继续执行下去,就报错了。 你可能在想那么我为什么使用通配符?呢? 其实,List 存在协变点的类的泛型参数必须声明为协变或者不变 当泛型类作为泛型参数类实例的生产者时用协变 in //垃圾 open class Waste //干垃圾 class DryWaste :...>兼容Producer 存在逆变点的类的泛型参数必须声明为协变或者不变 当泛型类作为泛型参数类实例的消费者时用协变 *号 *号 前面讲到了 Java 中单个?...中下限为`Nothing`,无法实例化。

    1.2K20

    java核心技术总结

    大家好,又见面了,我是你们的朋友全栈君。...,方法名和类名相同,无返回值声明(实际上会返回对象),可以空参也可以含参; 在不写构造器的情况下,JVM会自动在一个类中注入一个空参的构造器,如果写了构造器(不管有参还是无参),则不会自动生成; 许多框架在对类进行实例化的时候会调用空参构造器...枚举(enum) 六、java异常处理 1、错误和异常 (1)错误 error 运行时发生错误,编译器无法检查 从Error中恢复是不可能的 Error主要是由运行应用程序的环境引起的 示例:...); 三、java泛型 1、泛型本质:java 类型的参数化,增强 java 语言的动态性,使得可以编写出适用于各种类型的通用代码 2、泛型应用:泛型接口、泛型类、泛型方法(一般情况用泛型方法,不要轻易使用泛型类...,有利于明确泛型化的范围) 3、泛型擦除:泛型只存在于编译期,编译好的 class 文件反编译之后是看不到泛型的(伪泛型,目的是为了兼容以前没有泛型的版本) 4、擦除补偿 (1)擦除带来的问题:以下的操作都无法通过编译

    51610

    Python源码剖析:深度探索Cpython对象-达观数据

    在构建期间,你可能会收到一些错误,例如,dbm,sqlite3,uuid,nis,ossaudiodev,spwd 和tkinter 将无法使用这组指令构建。...在 Python 中创建一个对象,会分配内存并进行初始化,然后 Python 会用一个 PyObject * 来保存和维护这个对象,因此在 Python 中,变量的传递(包括函数的参数传递)实际上传递的都是一个泛型指针...以变量 a + b 为例,这个 a 和 b 指向的对象可以是整数、浮点数、字符串、列表、元组、甚至是我们自己实现了 add 方法的类的实例对象。...事实上,Python 内部创建一个对象的方法有两种:• 通过 Python/C API,可以是泛型API、也可以是特型API,用于内置类型• 通过对应的类型对象去创建,多用于自定义类型Python 对外提供了...以 f = 3.14 为例,底层结构如下:使用泛型 API 创建使用特型 API 创建综上,不管采用哪种方式创建,最终的关键步骤都是分配内存,创建内置类型的实例对象,Python 是可以直接分配内存的。

    29910

    C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性

    而在C#4.0中引入了泛型的协变性和逆变性. 2.1协变性 协变性指的是泛型类型参数可以从一个派生类隐式转化为基类....{ 5 //初始化泛型实例 6 List listObject = new List(); 7 List转化为IEnumerable 2.2逆变性 逆变性指的是泛型类型参数可以从一个基类隐式地转化为派生类,C...// 这样下面这行代码就会出现编译错误,因为泛型的协变和逆变是C# 4.0 中新增加的特性,而.Net 4.0对应于C# 4.0。...类型. 2.3协变和逆变的注意事项 (1)只有接口和委托才支持协变和逆变, 类或泛型方法的类型参数都不支持协变和逆变 (2)协变和逆变只适用于引用类型, 值类型不支持协变和逆变(例如List无法转化为

    1.4K80

    Java核心知识点整理大全11-笔记

    另外,调用 这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。 5.1.1.2. 异常分类 Throwable 是 Java 语言中所有错误或异常的超类。...的编译时类型无法获取具体方法 程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为 Object,但是程序有需要调用 该对象的运行时类型的方法。...JAVA 泛型 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本 质是参数化类型,也就是说所操作的数据类型被指定为一个参数。...表示该通配符所代表的类型是 T 类型的子类。 2. 表示该通配符所代表的类型是 T 类型的父类。 5.1.5.2. 泛型类 泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。...和泛型方法一 样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数, 也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。

    11410

    【C++篇】引领C++模板初体验:泛型编程的力量与妙用

    这意味着你可以编写一次代码,并通过不同的数据类型进行复用。C++通过模板(Template)来实现泛型编程,模板是泛型编程的核心工具。 1.1.1 为什么要有泛型编程?...这就是泛型编程 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。...因此,模板只有在实际使用(实例化)时,编译器才会生成对应的类型的代码。编译器无法预先知道你会使用哪些类型来实例化模板,因此它不会为模板生成实际的代码。...2.4.2 链接器无法找到定义 当你将类模板的声明放在头文件中,而把定义放在.cpp文件中时,模板实例化的过程可能发生在不同的编译单元中。...因为模板只有在编译期被实例化,链接器在链接时无法看到模板的定义,除非在编译时所有模板的实例化代码都可见。如果定义在.cpp文件中,其他使用模板的编译单元无法找到这个定义,导致链接器报错。

    23110

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

    各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。...因为很多时候我们不一定使用类越细越好,比如狗的共同点已经很相似了,一群狗我们可能使用dog来表示操作它们,但是在实例化可能根据哈士奇、藏獒、金毛等不同种类具体实例化。...就是在第二次显示的向下转向的时候,如果人为转换错误编译器无法识别,而必须等到代码执行时候才报错,这样的机制让java代码变得不太安全。 ?...Java泛型 在Object显示转换存在不安全行为的情况下,Java在jdk1.5以后提出了泛型机制,通过泛型就能有效避免转型时候出现的问题,泛型简单的理解就是在类、接口、方法中定义未知类型变量,只有初始化的时候才知道真正的类型...不过泛型更多的应用于框架的编写方面,在java中其实也是随处可见。尤其是集合类: ? 看了这篇泛型,下次设计链表二叉树别傻傻的用int 表示node节点的值了!我想你该知道正确的写法了!

    51520

    一文搞定泛型知识

    泛型为 .NET 引入了类型参数的概念,这样便可以把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候执行。下面我们就来讲解一下泛型的知识。...泛型促进了类型安全,它确保了参数化类中只有成员明确希望的数据类型才可以使用; 类型检查会在编译时发生进而减少了在运行时出现强制类型转换无效的错误; 泛型类成员使用的是值类型,因此就不会出现 object...3.默认值 当我们需要在泛型类的构造函数中部分属性进行初始化,而其他属性不进行初始化,但是我们在开发中无法确定传入泛型类中的类型参数是什么,因此我们也无法通过具体的值设置默认值。...嵌套泛型类型的外层也是一个泛型类型,外层的这个泛型类型通常被称为包容泛型类型,嵌套泛型类型会自动获得包容泛型类型的类型参数,这段话有些绕口,我详细讲解一下。...在这里我通过简单的几句来说一下约束继承。首先无论是泛型类型参数还是它们的约束都不会被 派生类 继承,这是因为泛型类型参数和约束不是类的成员。虽然不能被派生类继承,但是可以被从其派生的泛型类所继承。

    1K10
    领券