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

为什么此泛型类型不能擦除到指定的类

泛型类型在Java中是一种参数化类型,它可以在编译时指定具体的类型,从而增加代码的灵活性和安全性。在Java中,泛型类型的擦除是指在编译时将泛型类型擦除为其原始类型,即去除类型参数信息。

然而,有些泛型类型不能被擦除到指定的类,这是因为泛型类型的擦除规则是根据类型参数的边界进行擦除的。如果泛型类型的类型参数没有指定边界,即使用了无限制通配符(例如:List<?>),那么在擦除时会被擦除为Object类型。

另外,如果泛型类型的类型参数指定了边界,例如:List<? extends Number>,在擦除时会被擦除为边界类型的上界,即List<? extends Number>会被擦除为List<Number>。

这样做的原因是为了保证类型安全性。如果允许将泛型类型擦除为指定的类,可能会导致类型转换错误或运行时异常。因此,Java编译器在擦除泛型类型时会根据类型参数的边界进行处理,以确保类型安全。

需要注意的是,泛型类型的擦除只发生在编译时期,运行时并不会保留泛型类型的信息。这意味着在运行时无法获取泛型类型的具体参数信息。

对于此泛型类型不能擦除到指定的类的问题,腾讯云提供了一系列云计算产品和服务,例如云服务器、云数据库、云存储等,可以帮助开发者构建稳定、高效的云计算解决方案。具体产品和服务的介绍和链接地址可以参考腾讯云官方网站:https://cloud.tencent.com/

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

相关·内容

擦除是什么意思_方法区别

大家好,又见面了,我是你们朋友全栈君 在严格代码里,带声明总应该带着类型参数。但为了与老Java代码保持一致,也允许在使用带声明时不指定实际类型。...如果没有为这个指定实际类型,此时被称作raw type(原始类型),默认是声明该形参时指定第一个上限类型。...当把一个具有信息对象赋给另一个没有信息变量时,所有在尖括号之间类型信息都将被扔掉。...比如一个 List 类型被转换为List,则该List对集合元素类型检查变成了参数上限(即Object)。...上述规则即为擦除,可以通过下面代码进一步理解擦除: List list1 = ...; List list2 = list1; // list2将元素当做Object处理 从逻辑上来看

1.3K30

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

在不指定情况下,变量类型为该方法中几种类型同一父最小级,直到Object 在指定情况下,该方法几种类型必须是该实例类型或者其子类 public class Test...(1); list.add("121"); list.add(new Date()); } 3.类型擦除引起问题及解决方法 因为种种原因,Java不能实现真正,只能使用类型擦除来实现伪...不是说变量String会在编译时候变为Object类型吗?为什么不能存别的类型呢?既然类型擦除了,如何保证我们只能使用变量限定类型呢?...中参数话类型为什么不考虑继承关系?...3-2.自动类型转换 因为类型擦除问题,所以所有的类型变量最后都会被替换为原始类型。 既然都被替换为原始类型,那么为什么我们在获取时候,不需要进行强制类型转换呢?

1.7K40
  • 带你深挖Java类型擦除以及类型擦除带来问题

    在不指定情况下,变量类型为该方法中几种类型同一父最小级,直到Object 在指定情况下,该方法几种类型必须是该实例类型或者其子类 public class Test...(1); list.add("121"); list.add(new Date()); } 3.类型擦除引起问题及解决方法 因为种种原因,Java不能实现真正,只能使用类型擦除来实现伪...不是说变量String会在编译时候变为Object类型吗?为什么不能存别的类型呢?既然类型擦除了,如何保证我们只能使用变量限定类型呢?...中参数话类型为什么不考虑继承关系?...3-2.自动类型转换 因为类型擦除问题,所以所有的类型变量最后都会被替换为原始类型。 既然都被替换为原始类型,那么为什么我们在获取时候,不需要进行强制类型转换呢?

    3.8K21

    【进阶之路】Java类型擦除

    ---- highlight: a11y-light Java选择类型叫做类型擦除。什么是类型擦除呢?...因此,对于运行期间Java程序来说ArrayList和ArrayList其实是同一个类型。这也就是Java选择类型叫做类型擦除原因。...java.util.ArrayList 一、类型擦除 Java为什么采用这种呢?...因为类型擦除,我们无法直接从List中取得参数化类型T,所以只能从额外参数中传递一个数组类型进去进行转换。...当需要利用JDK 5之前开发遗留代码,而不得不这么做时,也尽可能隔离相关代码。 在使用带通配符时候,尽可能明确通配符所代表一组类型概念。 最好不要同数组一块使用。

    1.1K40

    【说站】java类型擦除转换

    java类型擦除转换 说明 1、值存在于编译阶段,当代码进入虚拟机时,值将被删除。 2、这个特征被称为类型删除。当被删除时,他有两种转换方法。...第一种是,如果没有设置类型上限,将转换为Object类型,第二种是如果设置了类型上限,将转换为其类型上限。...getT() {         return t;     }     public void setT(T t) {         this.t = t;     } } //通过反射调用获取他们属性类型...Field field : aClass.getDeclaredFields()) {         System.out.println("Test1属性:" + field.getName() + "类型为...:" + field.getType().getName());     } } 以上就是java类型擦除转换方法,希望对大家有所帮助。

    1.2K20

    方法、类型通配符使用

    方法、类型通配符使用 一.        声明和非声明类似,除了在名后面添加了类型参数声明部分...和方法一样,类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称标识符。...每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称标识符。...注意类型参数只能代表引用类型不能是原始类型(像int,double,char等) 1 public class GenericMethodTest 2 { 3 // 方法 printArray...4 5 双精度数组元素为: 1.1 2.2 3.3 4.4 字符数组元素为: H E L L O 有界类型参数:         可能有时候,你会想限制那些被允许传递一个类型参数类型种类范围

    3.8K40

    【Flutter】Dart ( | 方法 | 特定类型约束 )

    接口 , 方法 提供复用性 , 支持类型不确定数据类型 ; : 提高代码复用程度 ; 方法 : 参数或返回值有类型约束 , 参数或返回值类型必须符合对应类型 , 使用时会进行类型检查约束..., 如果设置错误类型 , 编译时报错 ; 示例 : /// 作用 : 为 , 接口 , 方法 提供复用性 , 支持类型不确定数据类型 /// /// : 提高代码复用程度 /...// 该类是一个缓存 , 缓存数据类型是 T , 该类型可以是任意类型 class Cache{ /// 缓存数据存储该 Map 集合中 Map...Tom I/flutter (24673): 测试, 类型整型, 获取缓存内容为 18 二、Dart 特定类型约束 ---- 还可以进行特定类型约束 , 如指定类型必须是某个子类.../ : 提高代码复用程度 /// 该类是一个缓存 , 缓存数据类型是 T , 该类型可以是任意类型 class Cache{ /// 缓存数据存储该 Map 集合中 Map

    5.2K00

    Java基础知识:类型擦除、逆变与协变

    ArrayList 对象,而不是 String 类型 ArrayList 因而该类型擦除。...第二个 Signature #15 : 指向来常量池中 Int 类型 ArrayList 是其父以及其信息。...总结:类型擦除 ≈ 没有擦除,无论是局部变量中传入还是定义上携带,只要传入了,那么在生成字节码文件中必然会额外记录这些具体信息。...对于不同对象可以通过不同反射机制来进一步获取被擦除类型: (一) 对于挂载在信息,可以通过来获取信: IntList.class.getGenericSuperclass();...code 部分指令,将 code 中信息去除掉了 ==> 即所谓擦除

    75230

    一句话,讲清楚java本质(非类型擦除

    = new Integer[]{1}; // 不报错 Integer[] ins2 = (Integer[]) objs2; } 类型擦除 java里是假,只在编译期有效,在运行时是没有概念...所以说java里面的是假,运行时不存在滴。 回归正题 数组不能向下强转我懂了,类型擦除我也懂了,似乎还是过不好这一生,呃不是,是还是解决不了这道题啊?...这就是关键所在,结合类型擦除,运行时并没有所谓,所以raw()返回其实是Object,但是调用者自己知道我要是String类型啊,所以我就知道强转一下喽。...呢? 我们上面举例子都是方法,那么呢?...总结 java中只在编译期有效,在运行时只有调用者知道需要什么类型,且调用者调用方法后自己做强制转换,被调用者是完全无感

    50730

    相关时,如何在两个之间创建类似子类型关系呢

    Integer(10)); // OK someMethod(new Double(10.1)); // OK 当然也是如此,在执行类型调用时,将Number作为其类型参数传递,如果参数是...那么问题来了,当相关时,如何在两个之间创建类似子类型关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型对象是如何实现子类型吧。...小结:可以通过继承或者实现接口来对其进行子类型化。 搞懂了子类型问题,我们回到“如何在两个之间创建类似子类型关系“问题。...或者接口并不会仅仅因为它们类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建或接口之间关系。

    2.9K20

    【Java基础】JavaCore核心-技术

    ,是 JDK 5 中引入一个新特性 本质是参数化类型,给类型指定一个参数,在使用时再指定参数具体值,那这个类型就可以在使用时决定 优点 把运行时错误,提前编译时,这样就可以在编译时把错误提示出来...2.为什么要用 在没有之前,从集合中读取到每一个对象都必须进行类型转换 如果插入了错误类型对象,在运行时转换处理就会出错 集合容器里面如果没指定类型,默认都是Object类型,那什么可以插入...,但不能直接创建对象和数组 Java 有类型擦除,任何类型擦除之后就变成了 Object 类型 因此创建对象就相当于创建了一个 Object 类型对象 所以直接创建对象和数组也行为被编译器禁止...作用范围:,接口,方法 (2)无类型限制擦除测试 //没指定类型擦除后是Object最顶级父 public class Generic { private T...} } 图片 8.数组创建 在 Java 中是不能直接创建对象和数组 主要原因是 Java 有类型擦除,任何类型擦除之后就变成了 Object 类型或者对应上限类型 那定义中如果需要用到数组

    36600

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

    为什么会引入 本质是为了参数化类型(在不创建新类型情况下,通过指定不同类型来控制形参具体限制类型)。...也就是说在使用过程中,操作数据类型指定为一个参数,这种参数类型可以用在、接口和方法中,分别被称为接口、方法。...为了解决中隐含转换问题,Java加入了类型参数上下边界机制。表示该类型参数可以是A(上边界)或者A子类类型。编译时擦除类型A,即用A类型代替类型参数。...在调用方法时,可以指定,也可以不指定: 在不指定情况下,变量类型为该方法中几种类型同一父最小级,直到Object 在指定情况下,该方法几种类型必须是该实例类型或者其子类...既然说类型变量会在编译时候擦除掉,那为什么我们往 ArrayList 创建对象中添加整数会报错呢?不是说变量String会在编译时候变为Object类型吗?为什么不能存别的类型呢?

    45810

    Java

    What:是什么? :参数化类型类型指定之前,是未知指定之后,范围就是固定。...示例,方法会以使用,相关联参数共同父,作为推断类型。不同集合类型,例如数组和Collection或者其他对象,不能成功推断出类型,会报出编译时错误。...为什么呢? 因为所有实例,在运行时,使用是同一份runtime class 文件。不管标签里type类型是什么。 ,对于所有可能标签,展现出行为,是一致。...Casts and InstanceOf 编译时使用了类型擦除, 运行时不存在类型变量。这意味着它们在时间和空间上都不需要性能开销,这很好。 但是,这也意味着您不能类型转换中可靠地使用它们。...Arrays 不能用Type-Parameter声明数组类型 T[] makeArray(T t) { return new T[100]; // Error. } 同样地,编译时使用了类型擦除

    2.3K51

    擦除)【java基础—-

    3.为什么要使用好处: 3.1好处 3.2好处 4.使用注意点: 4.1不同之间不能相互赋值,不存在多态((检查机制)特点(3)) 4.2要注意擦除...4.3不能实例化,例如 T t = new T(); 理由:擦除T都没了 4.4不能是基本类型本质是一种引用类型),还有考虑擦除类型,例如为Object类型时,Object...中引入一个新特性,其本质是参数化类型,也就是说所操作数据类型指定为一个参数(type parameter),这种参数类型可以用在、接口和方法创建中,分别称为接口、方法。...4.4不能是基本类型本质是一种引用类型),还有考虑擦除类型,例如为Object类型时,Object不能存储基本类型int,double… 5.擦除 5.1 擦除概念: 类型擦除指的是通过类型参数合并...,类型擦除了,为什么不同之间不能相互赋值!!

    2.4K51

    Java基础篇:类型擦除

    一、什么是本质是 参数化类型,也就是说 将所操作数据类型 指定为一个参数,在不创建新情况下,通过参数来指定所要操作具体类型(类似于方法中变量参数,此时类型也定义成参数形式),也就是说...super T> 表示类型下界,参数化类型T类型类型,直至object; 上界什么时候用:往集合中添加元素时,既可以添加T类型对象,又可以添加T类型对象。为什么?...五、Java实现方法–类型擦除: Java实现是靠类型擦除技术实现类型擦除是在编译期完成,也就是在编译期,编译器会将类型参数都擦除成它指定原始限定类型,如果没有指定原始限定类型擦除为...类型参数只能是类型(包括自定义),不能是简单类型(基本数据类型)。 3、什么时候用?...4、细节: (1)实际代表什么类型,取决于调用者传入类型,如果没传,默认是Object类型; (2)使用带创建对象时,等式两边指定类型必须一致。

    99021

    对java中理解

    3.1 擦除 是Java SE1.5新特性,本质是参数化类型,也就是说所操作数据类型指定为一个参数。...在确定了这个目标后,Java 设计者们和从事问题相关工作各个团队决策认为擦除是唯一可行解决方案。擦除使得这种向迁移成为可能,允许非代码和代码共存。...3.1.1 定义中擦除 3.1.1.1 无限制类型擦除定义中类型参数没有任何限制时,在类型擦除中直接被替换为Object,即形如和类型参数都被替换为Object。 ?...4.1 任何基本类型不能作为类型参数 ava 限制之一是不能将基本类型用作类型参数。不能创建 ArrayList 之类东西。 解决方法是使用基本类型包装器以及自动装箱机制。...和 T 区别 T 是一个 确定类型,通常用于方法定义,?是一个 不确定类型,通常用于方法调用代码和形参,不能用于定义方法。

    68920

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

    6.什么是通配符?什么是PECS原则? 7.虚拟机如何实现?什么是擦除? 8.kotlin中与Java有什么区别? 为什么我们需要?...也就是说在使用过程中,操作数据类型指定为一个参数,这种参数类型可以用在、接口和方法中,分别被称为接口、方法。...因为Java中是利用擦除实现,目前还有以下局限性: 1.不能用基本类型实例化类型参数 2.运行时类型查询只适用于原始类型 3.静态上下文中类型变量失效 4.不能创建参数化类型数组...5.不能实例化类型变量 6.不能捕获实例 不能在静态域或方法中引用类型变量。...为什么擦除后get不需要类型转换? 因为类型擦除问题,所以所有的类型变量最后都会被替换为原始类型

    1.1K00

    Java详解,史上最全图文详解「建议收藏」

    本质是参数化类型,即给类型指定一个参数,然后在使用时再指定参数具体值,那样这个类型就可以在使用时决定了。这种参数类型可以用在、接口和方法中,分别被称为接口、方法。...二:为什么使用 好处是在编译时候检查类型安全,并且所有的强制转换都是自动和隐式,提高代码重用率。 (1)保证了类型安全性。...super E>形式, 这里E就是该下边界.。 注意: 你可以为一个指定上边界或下边界, 但是不能同时指定上下边界。...为什么类型,String 都是父,不会出现类型不匹配问题,于是可以使用 String 进行类型擦除。...但是除此之外是,如果构建实例时使用了语法,那么编译器将标记该实例并关注该实例后续所有方法调用,每次调用前都进行安全检查,非指定类型方法都不能调用成功。

    83130

    如何使用 Java 来避免 ClassCastException

    深入探索 概念 是通过类型参数引入一组类型或接口. 类型参数:是一对尖括号之间以逗号分隔类型参数名列表。 一提到参数,最熟悉就是定义方法时有形参,然后调用方法时传递实参。...也就是说在使用过程中,操作数据类型指定为一个参数,这种参数类型可以用在、接口和方法中,分别被称为接口、方法。...传给T 声明和使用 声明涉及指定形式类型参数列表,并在整个实现过程中访问这些类型参数。...实例化 在 Java SE 7之前,在实例化时,必须为变量类型和构造函数指定相同实际类型参数。...可变长参数是使用数组存储,而数组和不能很好混合使用 简单说,数组元素数据类型在编译和运行时都是确定,而数据类型只有在运行时才能确定下来,因此当把一个存储数组中时,编译器在编译阶段无法检查数据类型是否匹配

    2.1K40
    领券