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

为什么Java泛型类型参数在运行时没有实现?

在Java中,泛型类型参数在运行时没有实现,是因为泛型是通过擦除实现的。泛型是在Java 1.5中引入的,为了保持向后兼容性,泛型在编译时被转换为原始类型,而泛型参数的类型信息在编译后被擦除。

擦除是指在编译时,泛型的类型参数被替换为它们的上限或者是Object类型,这样在运行时,泛型的类型信息就不再存在。这种机制被称为类型擦除,它使得泛型可以在不影响已有代码的情况下引入。

例如,List<String>在编译后会被转换为List<Object>,因此在运行时,Java无法获得泛型的类型参数。这种设计可以避免在运行时出现类型转换错误,同时也允许泛型代码在不同类型的参数之间进行重用。

总之,Java泛型类型参数在运行时没有实现,是因为泛型是通过擦除实现的。这种机制可以保持向后兼容性,同时也避免了在运行时出现类型转换错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在运行时(Runtime)获得的真正类型

前言 由于Java类型擦除机制,在编译时都被转为了Object,例如List经过编译之后将变为类型 List。...可以通过以下的方式再运行时获得的真正类型 如何获得具体类型 List 例子如下 来自:https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list...package test; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.util.ArrayList...jackson 中如何反序列化 jackson 中将JSON 转为Map 的可以通过如下代码实现,方式一: ObjectMapper mapper = new ObjectMapper(); String...,但是没有指定Map里边存放的数据是什么类型,所以得到结果之后还需要对 Object name 做一次强制类型转换才能够使用。

2.7K20

java:通过自定义ParameterizedType实现参数类型类型参数的替换

需求说明 如果要动态构造一个参数对象(ParameterizedType),guava提供的TypeToken工具可以部分实现这个功能: 比如下面这个例子(来自guava wiki TypeToken...其实既然TypeToken工具能根据TypeParameter构造一个新的ParameterizedType,实现上面这个需求并不复杂,不知道为什么guava没有提供这个方法(我用的版本是16)。...sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl的代码几乎是原封不动的抄来,在此基础上根据需要增加了构造方法和transform方法实现参数类型替换...ParameterizedTypeImpl(TypeToken.of(this).getRawType(), typeArgs, getOwnerType()); } /** * 用指定的类型参数替换当前对象的类型参数... * 新参数的个数与当前对象的类型参数个数必须一致, * 如果新参数数组中元素为{@code null}则对应的参数不会被替换 * @param newTypeArguments

4.7K80

【面试题精讲】什么是?有什么作用?

Java 中,通过使用尖括号来指定类型参数。例如,List表示一个只能存储字符串类型元素的列表。 2. 为什么需要?...在没有的情况下,我们可能需要为每个数据类型都编写相应的类或方法,这样会导致代码冗余,并且难以维护。而有了,我们可以将类型作为参数传递给类或方法,使其具有通用性,可以处理多种类型的数据。...实现原理 Java 中的是通过类型擦除(Type Erasure)来实现的。在编译过程中,所有的类型信息都被擦除,替换成它们的上界(或者 Object 类型)。...这样做的好处是可以保持与旧版本 Java 代码的兼容性,并且减少了运行时的开销。 尽管类型信息在运行时被擦除了,但编译器仍然会进行类型检查来确保类型安全。...的缺点 类型擦除:由于是通过类型擦除实现的,导致在运行时无法获取到具体的类型信息。 限制:不能使用基本数据类型作为类型参数,只能使用引用类型

70960

extends BaseClass->BaseClass 如何工作:   是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。...你无法在运行时访问到类型参数,因为编译器已经把类型转换成了原始类型。...根据你对这个问题的回答情况,你会得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。...java实现根植于“类型消除”这一概念。当源代码被转换为Java虚拟机字节码时,这种技术会消除参数类型。有了Java,我们可以做的事情也并没有真正改变多少;他只是让代码变得漂亮些。...类型参数在运行时被抹去。在C++中,类型参数不同,实例变量也不同。

1.1K50

Raw use of parameterized class Future

解析:List:参数类型,表示元素类型为Future的列表;List:是与参数类型相对应的原生态类型;原生态类型List和Java平台没有之前的接口类型完全一样;List:...;E:形式类型参数; 那为什么不建议使用原生态类型呢?...,对instanceof不会产生任何影响; 创建参数类型或者类型参数的数组是非法的; 这些例外都源于:信息可以在运行时被擦除;,只存在于代码的编译阶段,并且会在运行时候擦除它们的元素类型信息...擦除就是使可以与没有使用的代码可以随意进行互用; 解决最开始遇到的问题 代码本身没有问题,也使用了参数类型,但是值得注意的是Future也是一个类。...首先我确定我的使用是安全的,不会在运行时候导致错误,则可通过 @SuppressWarnings("rawtypes")消除使用原生态类型警告。

10K10

Java深入理解「建议收藏」

Java中的基本上都是在编译器这个层次来实现的,这也是Java被称为“伪”的原因。 原始类型 原始类型就是类型擦除了信息后,在字节码中真正的类型。...对象都没有创建,如何确定这个参数是何种类型,所以当然是错误的。...是一种编译时类型确认机制。它提供了编译期的类型安全,确保在类型(通常为集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。...2、Java是如何工作的 ? 什么是类型擦除 ? 的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。...编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List类型来表示。为什么要进行擦除呢?这是为了避免类型膨胀。 3.

77420

10 道关于 Java 的面试题

它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。 2. Java是如何工作的 ? 什么是类型擦除 ?...这是一道更好的面试题。是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List来表示。...这样做的目的,是确保能和Java 5之前的版本开发二进制类库进行兼容。 你无法在运行时访问到类型参数,因为编译器已经把类型转换成了原始类型。...根据你对这个问题的回答情况,你会得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。更多请参考这篇文章《揭开Java 类型擦除神秘面纱》。...Java中如何使用编写带有参数的类? 这是上一道面试题的延伸。面试官可能会要求你用编写一个类型安全的类,而不是编写一个方法。

68720

10 道 Java 面试题

它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。   2. Java是如何工作的 ? 什么是类型擦除 ?   ...这是一道更好的面试题。是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List来表示。...这样做的目的,是确保能和Java 5之前的版本开发二进制类库进行兼容。你无法在运行时访问到类型参数,因为编译器已经把类型转换成了原始类型。...根据你对这个问题的回答情况,你会得到一些后续提问,比如为什么是由类型擦除来实现的或者给你展示一些会导致编译器出错的错误代码。请阅读我的Java是如何工作的来了解更多信息。   3....Java中如何使用编写带有参数的类?   这是上一道面试题的延伸。面试官可能会要求你用编写一个类型安全的类,而不是编写一个方法。

59.8K256

深入理解

类型擦除的深入探讨 类型擦除是实现的核心,Java类型信息只在编译阶段存在,在运行时这些信息会被擦除。这是为了保持向后兼容性,因为在Java 5之前的版本中并不存在。...具体来说,对象类型参数会被擦除到它们的第一个边界(默认为Object),而基本数据类型参数会被自动装箱。 类型擦除的影响 类型擦除意味着在运行时,所有类实例都属于同一原始类型。...这就是为什么在运行时我们不能直接询问一个对象是否是List或是List,因为所有的类型信息在运行时都不可获得。...的局限性 尽管在很多方面都提供了好处,但它们也有一些局限性,了解这些局限性对于高效使用Java至关重要。 类型擦除 类型擦除意味着在运行时类的实例不保留关于其类型参数的任何信息。...异常与 不能捕获或抛出类型参数的异常,因为异常处理是在运行时进行的,而类型信息在运行时是不可用的。

18830

Java

Why:为什么要引入Java 集合框架中的数据元素,是Object类型,也就是可以是任意类型。 在使用集合数据时,需要显式地调用 强制类型转换。...1) 有可能引发ClassCastException 2) 问题暴露在运行时 使用强制约束数据类型可以将 类型 转换问题暴露在编译期。 How:如何使用?...为什么呢? 因为所有类的实例,在运行时,使用的是同一份runtime class 文件。不管标签里的type类型是什么。 类,对于所有可能的标签,展现出的行为,是一致的。...这也是不能在静态方法,或者initailizer中引用类型参数的原因。 Casts and InstanceOf 编译类时使用了类型擦除, 运行时不存在类型变量。...支持Java编译器(例如JDK1.5中的Javac)可以用来编译经过扩充的Java程序(Generics Java程序),但是现有的没有使用扩充的Java程序仍然可以用这些编译器来编译。

2.2K51

Kotlin入门潜修之类和对象篇—及其原理

如果我们了解java中的,那么本篇文章提到的kotlin我们也不会陌生。但是如果之前没有接触过或者没有真正理解,本篇文章理解起来可能有些困难,不过我会尽量阐述的通俗易懂。...而假如我们在创建类型的时候也为其指定参数,这个参数又是个类型,那么我们就称之为。 那么的作用和意义是什么?使用能够像传递参数一样传递类型,同时保证运行时类型安全。...错误,这句代码运行的时候会抛ClassCastException异常 } 这就是为什么java不允许我们这么做的原因,就是为了保证运行时类型安全。...所以,我们无法在运行时获取任何信息,也无法在运行时做任何类型转换检查。...(list的类型在运行时都是List),无法使用is进行类型判断 } } 至此,我们已经讲完了kotlin中的

90430

Java | 实现机制

前言 的本质是参数类型,就是将原来的具体的类型参数化。...在不确定需要类型的情况下,通过来指定具体的限制 Java实现机制就是类型擦除,在编译的时候被擦除为 Obect 类型擦除有哪些好处 首先是运行时内存负担小,经过了类型擦除后,在运行期间,内存里面是不会有的...对比下面的 C# ,在运行时是真实存在的。 还有就是兼容性好了, 类型擦除有哪些问题 基本类型无法作为的实参 所有就有了装箱和拆箱的类型,这就涉及到了装箱和拆箱的内存开销。...类型擦除对反射的影响 擦除后就会导致在反射的时候有些信息获取不到,但是 java 提供了附加的签名信息。 附加的签名信息,如果实现了一个带的类,并且确定的类型。...Kotlin 反射的实现原理 Kotlin 的每一个类在编译后都会有一个注解,叫做 Metadata,这个注解里面就会有这个类的名称,方法名称,签名等信息 总结 Java通过类型擦除来实现 类型编译时被擦除为

69620

Java :理解和应用

尽管擦除带来了一些限制,如无法在运行时获取类型参数的具体类型等,但通过类型通配符、反射和其他技术,仍然可以在一定程度上处理类型的信息。...设计的本质就是权衡,Java 设计者为了兼容性不得已选择的擦除信息的方式,虽然完成了对历史版本的兼容,但付出的代价也是显著的,擦除信息对于 Java 代码可能引发以下问题: 无法在运行时获取类型参数的具体类型...:由于擦除信息,无法在运行时获取类型参数的具体类型。...这意味着在运行时你不能查询一个对象的真实类型 不能实例化类型的类:你不能使用 new T(),new E()这样的语法来创建类型的对象,还是因为类型被擦除 不能使用基本类型作为类型参数:因为是编译器的语法糖...总结 在出现之前,集合类库并不能在编译时期检查插入集合的对象类型是否正确,只能在运行时期进行检查,这种情况下一旦出错就会在运行时抛出一个类型转换异常。

22531

(37) (下) - 细节和局限性 计算机程序的思维逻辑

这些局限性主要与Java实现机制有关,Java中,是通过类型擦除来实现的,类型参数在编译时会被替换为Object,运行时Java虚拟机不知道这回事,这带来了很多局限性,其中有的部分是比较容易理解的...运行时类型信息不适用于 在介绍继承的实现原理时,我们提到,在内存中,每个类都有一份类型信息,而每个对象也都保存着其对应类型信息的引用。...不过,对于静态方法,它可以是方法,可以声明自己的类型参数,这个参数类的类型参数没有关系的。...Java必须在运行时知道你要转换成的数组类型类型可以作为参数传递给toArray方法,比如: public E[] toArray(Class type){ Object copy =...小结 本节介绍了的一些细节和局限性,这些局限性主要是由于Java实现机制引起的,这些局限性包括,不能使用基本类型没有行时类型信息,类型擦除会引发一些冲突,不能通过类型参数创建对象,不能用于静态变量等

90660

C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第二部分

现在我们抛开表面看本质,Java 和 C# 的实现机制是截然不同的。我认为最大的不同在于:.NET平台下的不只是一个语言特色。根植于 CLR 和 .NET 的类型系统。...这也就是为什么可以在运行的时候表现出来。 而 Java 则选择了另一个不同的方式实现,一言以蔽之,他们是在编译时实现的。...而且 Java 编译器把化从代码中移除了,并注入了对象,有效的对象替代了类型参数信息。也就是说呀,Java 在运行时根本没有这一说。...相对于我们的实现来说,java并不能带来性能的收益,很显然吗,不管外表 List 看起来多么Java 在运行时压根没这马事儿,你不得不自己做运行时的动态检查和类型转换。...更微妙的是,因为 Java 没有在运行时信息,你从你的编译后的代码丢失了信息。。

85431

Effective-java-读书笔记之

例如, 与List相对应的原生态类型是List. 与Java平台没有之前的接口类型List完全一样.如果使用原生态类型, 就失掉了在安全性和表达性方面的所有优势..... -> Sub[]是Super[]的子类型.是不可变的(invariant). -> List和List没有类型关系.所以有些类型错误的问题用数组可能要在运行时才能发现..., 而用列表在编译时就发现了.第二大区别:数组是具体化的(reified), 在运行时才知道并检查元素类型约束.是通过擦除(erasure)来实现的....在编译时强化类型信息, 并在运行时丢弃(或擦除)类型信息....把一个值保存在的可变参数数列中是不安全的.那么为什么声明的数组是非法的, 而这种可变参数声明是合法的呢?

42160

详解Gson的TypeToken原理

擦除 众所周知,Java只在编译时有效,到了运行时这个类型就会被擦除掉,即List和List在运行时其实都是List类型。...为什么选择这种实现机制?不擦除不行么? 在Java诞生10年后,才想实现类似于C++模板的概念,即。...同时正正有这个这么"坑"的机制,令到我们无法在运行期间随心所欲的获取到参数的具体类型。...为什么要通过子类来获取类型? 这是TypeToken能够获取到类型的关键,这是一个巧妙的方法。...ParameterizedType是表示带有参数类型Java类型,JDK1.5引入了之 后,Java中所有的Class都实现了Type接口,ParameterizedType则是继承了Type

4.9K22

听了他讲的,我就明白为什么他的工资比我多30万了!

1 类 擦 除 Java是怎么实现的?不错,类型擦除。...好了,解释了这么多类型擦除的机制,那Java使用类型擦除来实现有什么好处呢? 1、第一点我们将如此多的在编译时擦除了,那么在运行时显然可以省不少的内存空间嘛。 ?...2、第二点不得不说下兼容性,Java是在1.5版本推出的,那1.5之前存在大量的线上代码没有的,总不能舍弃吧,所以编译擦除后和没有不是一样吗,这就兼容了之前更老的Java版本。...2、不能用来方法的重载 为什么呢?举个例子: ? 如上图所示,在不同的作为参数时,编译器编译时进行类型擦除,那参数不就一样了吗?那还谈什么重载呢!...而C#没有进行类型擦除,所以编译完后是带有类型的,所以可以当作是重载的。 3、类型不能当作真实的类型使用 ?

55921

Carson带你学Java知识知多少

目录 定义 意义(即为什么要使用) 作用及特点 原理 额外说明: List能否转为List? 定义 可理解为 适配广泛的类型,即参数类型,可以把类型像方法的参数那样进行传递。...ArrayList(); // 相当于 public class ArrayList { private Float[] array; //... } 意义(即为什么要使用...如对集合类取数据时,不需 对存储的数据 进行强制类型转换。 原理 基于 类型擦除。即即 使用时加上的类型参数,会在编译器在编译时去掉所以,在生成的 Java 字节码中,不包含中的类型信息。...这里需要特别说明的是: Java中的是在编译器层次实现,编译器在编译时尽可能的发现可能出错的地方,但仍无法避免在运行时刻出现类型转换异常的情况; 在代码中定义的List 、List等类型,在编译后都会变成...进行数据的强制转换 而这种转换是基于开发者对该数据类型明确的情况下进行(如将Object转换为String);若类型不一致,编译器在编译过程中不会报错,但在运行时会出错 额外说明: List能否转为

41420
领券