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

泛型篇

extends BaseClass->BaseClass 如何工作:   泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。...根据你对这个泛型问题的回答情况,你会得到一些后续提问,比如为什么泛型是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误泛型代码。...这和 C++模板截然不同。在 C++,模板本质上就是一套宏指令集,只是换了个名头,编译器会针对每种类型创建一份模板代码的副本。...在Java,可以将模板的参数类型限定为某种特定类型。   在C++,类型参数可以实例化,但java不支持。   在Java,类型参数不能用于静态方法(?)...在C++,类型参数不同,实例变量也不同。

1.1K50

Java的泛型_Effective Java 2.0_Item 1知识点

与泛型相关的一些概念 2.1 类型擦除 正确理解泛型概念的首要前提是理解类型擦除(type erasure)。 Java的泛型基本上都是在编译器这个层次来实现的。...在生成的Java字节代码是不包含泛型的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。...Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方式与C++模板机制实现方式之间的重要区别。...因此,编译器禁止这样的行为。编译器会尽可能的检查可能存在的类型安全问题。对于确定是违反相关原则的地方,会给出编译错误。当编译器无法判断类型的使用是否正确的时候,会给出警告信息。...为了与Java关键字区别开来,Java泛型参数只是使用一个大写字母来定义。

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

彻底搞懂泛型

表示不确定的类型 T (type) 表示具体的一个java类型 K V (key value) 分别代表java键值的Key Value E (element) 代表Element 这些字母随意使用,...在编译过程,类型变量的信息是能拿到的。所以,set方法在编译器可以做类型检查,非法类型不能通过编译。但是对于get方法,由于擦除机制,运行时的实际引用类型为Object类型。...泛型参数将会被擦除到它的第一个边界(边界可以有多个,重用 extends 关键字,通过它能给与参数类型添加一个边界)。编译器事实上会把类型参数替换为它的第一个边界的类型。...如果没有指明边界,那么类型参数将被擦除到Object。 4、?和 T 的区别 ?使用场景 和Object一样,和C++的Void 指针一样,基本上就是不确定类型,可以指向任何对象。一般用在引用。...4、创建类型实例 问题:泛型代码不能new T()的原因有两个,一是因为擦除,不能确定类型;而是无法确定T是否包含无参构造函数。

61120

Java泛型详解

优缺点 从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误。...Java的泛型基本上都是在编译器这个层次来实现的。 在生成的Java字节代码是不包含泛型的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。...Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方式与C++模板机制实现方式之间的重要区别。...} 这段代码,inspect方法接受List作为参数,当在test方法中试图传入List的时候,会出现编译错误。...因此,编译器禁止这样的行为。编译器会尽可能的检查可能存在的类型安全问题。对于确定是违反相关原则的地方,会给出编译错误。当编译器无法判断类型的使用是否正确的时候,会给出警告信息。

1.7K00

Java 泛型详解

但是这样很明显是错误的,因为除了short, int, double, long, float, byte, char等原始类型,其他的类并不一定能使用操作符>,所以编译器报错,那怎么解决这个问题呢?...类型擦除 Java泛型中最令人苦恼的地方或许就是类型擦除了,特别是对于有C++经验的程序员。...上面的概念或许还是比较好理解,但其实泛型擦除带来的问题远远不止这些,接下来我们系统地来看一下类型擦除所带来的一些问题,有些问题在C++的泛型可能不会遇见,但是在Java却需要格外小心。...类似这样的错误假如出现才实际的应用场景,将非常难以察觉。 如果你对上面这一点还抱有怀疑的话,可以尝试运行下面这段代码: ?...如果我们一开始加上Node n = mn就好了,这样编译器就可以提前帮我们发现错误

65550

深入理解 Java 泛型

Java的泛型 Java 泛型的实现与 C++ 不同,Java 中一个泛型类只会产生一份目标代码,而 C++ 则会根据具体的参数实例产生多份目标代码,是什么意思呢?...Java编译器的类型转换和类型检查 类型自动转换 既然上面所说Java会在编译时对泛型进行擦除,那么它要实现同一份泛型代码不同类型通用必然需要类型转换,事实上编译器也是这么干的,比如下面的这一段代码:...类型检查 由于类型擦除可能导致的一些异常问题,编译器需要做类型检查来尽量确保程序在运行时不会抛出异常,我们在写泛型相关代码时,将泛型擦除考虑进去后再想这段代码在运行时会不会有异常,然后再看编译器报的错误也就理解了...SIZE]; // Error T[] array = (T) new Object[SIZE]; // Unchecked warning } } 在上面的 create 的几行代码都是编译器会报错误的...Kotlin的泛型 Kotlin的泛型也是伪泛型,存在泛型擦除,因为它们都是JVM语言?

54920

Java泛型介绍

C++的模板(template)是典型的Code specialization实现。C++编译器会为每一个泛型类实例生成一份执行代码。...执行代码integer list和string list是两种不同的类型。这样会导致代码膨胀(code bloat),不过有经验的C++程序员可以有技巧的避免代码膨胀。     ...而这也是Java编译器采用Code sharing方式处理泛型的主要原因。     ...编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。     ...五、Just remembe 1.虚拟机没有泛型,只有普通类和普通方法 2.所有泛型类的类型参数在编译时都会被擦除 3.创建泛型对象时请指明类型,让编译器尽早的做参数检查(Effective Java

43220

简述C语言宏定义的使用

当宏作为常量使用时,C程序员习惯在名字只使用大写字母。但是并没有如何将用于其他目的的宏大写的统一做法。由于宏(特别是带参数的宏)可能是程序错误的来源,所以一些程序员更喜欢使用大写字母来引起注意。...feral) bar(wolf); baz(wolf); ==baz(wolf);==,不在判断条件,显而易见,这是错误。...如果需要公布某个宏,那么该宏定义应当放置在头文件,否则放置在实现文件(.cpp)的顶部。 不要使用宏来定义新类型名,应该使用typedef,否则容易造成错误。...因为有些编译器可能会把宏后面的行注释理解为宏体的一部分。 尽量使用const取代宏来定义符号常量。...& 255)) #define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8)) 将一个字母转换为大写 #define UPCASE(c) (((c)>='a' &

1.6K20

Java一分钟之-泛型擦除与类型安全

在Java,泛型是一种强大的工具,它允许我们在编写代码时指定容器(如集合)所存储的数据类型。然而,Java的泛型并非像C++或某些其他语言那样是静态类型检查的,而是采用了“类型擦除”的机制。...泛型擦除 泛型擦除是指在编译期间,Java会将泛型信息(如 )从字节码移除。这意味着在运行时,所有的泛型容器(如 List)都会退化为无参数的基类(如 List)。...类型安全 尽管有类型擦除,但Java的泛型依然提供了类型安全。在编译阶段,Java会进行类型检查,确保我们只能向泛型容器添加正确的类型。...例如,以下代码会引发编译错误: stringList.add(123); // 错误:不能将int添加到List 3....易错点与避免方法 3.1 类型转换警告 由于类型擦除,当我们从泛型容器取出元素时,需要显式转换,这可能会产生警告: Object item = stringList.get(0); String str

12510

深入理解泛型

泛型的定义 在Java,泛型的核心概念是类型参数化,即允许定义类或方法时不指定具体的类型,而是使用类型参数(通常以单个大写字母表示,如E、T、K、V等)来代替实际的类型。...Java泛型的工作原理 泛型在Java的工作原理是复杂且精妙的,涉及编译器的类型推断、类型擦除以及桥接方法等多个方面。...编译器在编译过程负责泛型的类型检查和类型推断,确保类型的正确性。 类型擦除的实现 当代码被编译成Java字节码时,所有的泛型类型参数都会被替换掉。...如何进行类型检查 当编译器遇到泛型代码时,它会根据类型参数的声明来检查代码的类型使用。如果代码尝试将不兼容的类型放入泛型容器,或者以不正确的方式使用泛型类型,编译器就会报错。...通常,类型参数名称是单个大写字母

17530

更深入地理解Java泛型

引言 jdk5.0引入了Java泛型,目的是减少错误,并在类型上添加额外的抽象层。 本文将简要介绍Java的泛型、泛型背后的目标以及如何使用泛型来提高代码的质量。 2....编译器可以在编译时强制执行该类型。 在较小的程序,这看起来像是一个微不足道的添加。但是在较大的程序,这可以增加显著的健壮性并使程序更易于阅读。 3....,并选择更具描述性的字母来表示形式类型,例如在Java集合,T 用于类型,K 表示键,V 表示值。...(可能有点绕,大家好好细品一下) 例如,List不是 List的超类型,将List类型的变量赋值给List类型的变量将导致编译器错误。...类型擦除 泛型被添加到Java以确保类型安全,并确保泛型不会在运行时造成开销,编译器在编译时对泛型应用一个名为type erasure的进程。

99330

一个故事读懂Java泛型

你们没有,朕这里可是有啊,来人,宣C++帝国的使者进殿!” 2 C++使者 一个年轻人在大家狐疑的目光走了进来, 在大殿中央给国王行了礼。...泛型使者说:“这么做会增加使用者的责任,编译器也无法帮忙, 在运行时才会抛出Class Cast 异常。” “那你说说,怎么才能让编译器帮忙?”...“众位爱卿,估计你也看到了,这个‘泛型’能够在编译期检查出错误, 使用List的人也不用做强制转型了,还是很有好处的。我们Java 也应该加上类似功能” “怎么加上呢? ” 集合框架大臣问道。...国王说:“不用担心,我已经给C++的泛型使者深谈过,我们不用膨胀法, 相反,我们用擦除法。” “擦除法? ” 众大臣面面相觑。...“这个容易,可以做一个类型的限制, 让臣民们传入类型T必须是Comparable的子类才行, 要不然编译器就报错, 我建议使用extends关键字。” C++的泛型使者看起来很有经验。 ? ?

58440

Java的泛型

至少在表面上看来,泛型很像 C++ 的模板。与 Java —样,在 C++ ,模板也是最先被添加到语言中支持强类型集合的。但是,多年之后人们发现模板还有其他的用武之地。...此外,这里没有错误检査。可以向数组列表添加任何类的对象。对于 files.add(new File("..."); 这个调用,编译和运行都不会出错。...现在, 编译器可以进行检査,避免插入错误类型的对象。例如下面的代码是无法通过编译的。这将比使用 Object 类型的参数安全一些,出现编译错误比类在运行时出现类的强制类型转换异常要好得多。...", "Public");在这种情况(实际也是大多数情况)下,方法调用可以省略 类型参数。编译器有足够的信息能够推断出所调用的方法。...翻译泛型方法类型擦除也会出现在泛型方法

22330

让你的代码更CPP一点(前缀树示例)

1.nullptr nullptr是为了补充并替代NULL的,由于之前老版本的NULL定义一般为0,但有时候又被编译器定义为((void*)0)。...这样就会出现混乱,特别是进行函数重载的时候,就会让编译器搞不清楚NULL的具体类型,因此,引入nullptr可以更好的区分0和空指针,因此,在新版,尽量使用nullptr代表空指针进行初始化。...+中最烦的就算是各种类型声明的编写,太多字母了,而且有时候也会忘记,由于他们的类型定义太多太乱了!...,十分的方便,而在Cfor循环是又丑又长,C++标准为了简化代码量,提供了新的范围for语句:for(auto c : str); // C风格 for(std::vector::iterator...shared_ptrp = new int(5); //错误 shared_ptrp(new int(5)); shared_ptrp = make_shared<int

62220

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

Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码是不包含泛型的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。...Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法在运行时刻出现的类型转换异常的情况,类型擦除也是Java的泛型与C++模板机制实现方式之间的重要区别。...原始类型 就是擦除去了泛型信息,最后在字节码的类型变量的真正类型,无论何时定义一个泛型,相应的原始类型都会被自动提供,类型变量擦除,并使用其限定类型(无限定的变量用Object)替换。...因为种种原因,Java不能实现真正的泛型,只能使用类型擦除来实现伪泛型,这样虽然不会有类型膨胀问题,但是也引起来许多新问题,所以,SUN对这些问题做出了种种限制,避免我们发生各种错误。...既然类型擦除了,如何保证我们只能使用泛型变量限定的类型呢? A: Java编译器是通过先检查代码泛型的类型,然后在进行类型擦除,再进行编译。

3.8K21
领券