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

Java Generics:无法将List <SubClass>强制转换为List <SuperClass>?

这个问题涉及到Java编程语言中的泛型和类型转换。Java Generics是一种在编译时提供类型安全的编程机制,它可以避免类型转换错误,并在编译时检查类型错误。

在这个问题中,无法将List <SubClass>强制转换为List<SuperClass>的原因是Java泛型中的类型擦除机制。在编译时,泛型类型会被擦除,只保留原始类型,因此List <SubClass>和List<SuperClass>在运行时会被转换为List<Object>类型。由于Java不支持隐式向下转型,因此无法将List <SubClass>直接转换为List<SuperClass>。

为了解决这个问题,可以使用通配符来实现类型转换。例如,可以使用List <? extends SuperClass>来表示一个可以接受SuperClass及其所有子类的列表。这样,可以将List <SubClass>赋值给List <? extends SuperClass>类型的变量。

总之,Java泛型中的类型擦除机制导致了无法将List <SubClass>强制转换为List<SuperClass>的问题。为了解决这个问题,可以使用通配符来实现类型转换。

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

相关·内容

  • java中如何将数组转换为List

    Java 必知必会 第 2 篇 (精挑 Stack Overflow在java中排名前100的问题 懂得这些问题的答案帮你解决80%开发问题 ) 问题 假设有数组 Element[] array =...{newElement(1),newElement(2),newElement(3)}; 如何将其转换为ArrayList arraylist = ???...Arrays.asList(array)或者Arrays.asList(new Element(1),new Element(2),new Element(3)) 不过,这样做有些坑要注意: 这样做生成的list...如果修改数组的值,list中的对应值也会改变! Arrays.asList() 返回的是Arrays内部静态类,而不是Java.util.ArrayList的类。...(arraylist, array); 这将会是一个系列,我接下来会更新mysql,mongodb,java,linux等,精挑 Stack Overflow在中排名前的问题,一般知道这些问题,可以帮助我们快速解决开发中遇到

    3.1K30

    深入分析Java反射(三)-泛型

    举个很简单的例子,在引入泛型之前,ArrayList内部只维护了一个Object数组引用,这种做法有两个问题: 从数组列表获取一个元素的时候必须进行类型的强转。...向数组列表中可以添加任何类型的对象,导致无法得知数组列表中存放了什么类型的元素。...Java中的泛型实现的是编译期的类型安全,也就是泛型的类型安全检查是在编译期由编译器(常见的是javac)实现的,这样就能够确保数据基于类型上的安全性并且避免了强制类型转换的麻烦(实际上,强制类型转换是由编译器完成了...再议泛型数组的问题 在Java泛型约束中,无法实例化参数化类型数组,例如Pair[] table = new Pair[10];是非法的。...《Java核心技术卷I-基础知识》 维基百科-Generics in Java (本文完 e-20181204-c-3d r-20181205) 本文是Throwable的原创文章,转载请提前告知作者并且标明出处

    1.6K20

    Java泛型一览笔录

    泛型(Generics )是把类型参数化,运用于类、接口、方法中,可以通过执行泛型类型调用 分配一个类型,将用分配的具体类型替换泛型类型。...泛型主要有两个好处: (1)消除显示的强制类型转换,提高代码复用 (2)提供更强的类型检查,避免运行时的ClassCastException 3、泛型的使用 类型参数(又称类型变量)用作占位符,指示在运行时为类分配类型....get(0); // 编译错误:无法自动转型为 Number Object o33 = list3.get(0); } } 那么我们看到 如 List<?...5、类型擦除 Java的泛型在编译期间,所有的泛型信息都会被擦除掉。...constructed without actual type information"); // } else { this.type = ((ParameterizedType) superClass

    99960

    C++继承、虚函数、RTTI、友元类、异常处理

    :endl; } }; class SubClass : public SuperClass{ public: SubClass(const int & a):SuperClass...接下来看看继承下析构的表现,假设我们将析构改为如下。...//SubClass //SuperClass destructor 发现已经被定向为子类的析构函数了 纯虚函数 在java中我们有接口的定义,接口定义的方法必须是抽象方法,要求子类必须实现,纯在抽象方法的类不能实例化...我们先看看以前的强制类型转换 long a = 10l; int * b = (int *) (&a); 这样可以将long类型指针强制转为int类型指针,但是这种转化方式是直接更改编译器对该内存空间的读取方式...并且如果向下转型是错误的,也不会报错,static_cast与强制转化类似,将当前引用/指向的内存空间作为转化后的类型来用,这会导致一些不可知的错误,如读取从成员变量所对应的空间是别的用途或者未初始化的

    80510

    详解Gson的TypeToken原理

    泛型擦除 众所周知,Java的泛型只在编译时有效,到了运行时这个泛型类型就会被擦除掉,即List和List在运行时其实都是List类型。...Java的类库是Java生态中非常宝贵的财富,必须保证向后兼容(即现有的代码和类文件依旧合法)和迁移兼容(泛化的代码和非泛化的代码可互相调用)基于上面这两个背景和考虑,Java设计者采取了"类型擦除"这种折中的实现方式...同时正正有这个这么"坑"的机制,令到我们无法在运行期间随心所欲的获取到泛型参数的具体类型。...正如上面说的,如果直接把List>的类型传过去,但是因为运行时泛型被擦除了,所以得到的其实是List,那么后面的Gson就不知道要转成Map subclass) { Type superclass = subclass.getGenericSuperclass(); if (superclass instanceof Class) {

    5.7K22

    掌握 Java-TypeToken 原理及泛型擦除

    泛型擦除 众所周知,Java的泛型只在编译时有效,到了运行时这个泛型类型就会被擦除掉,即List和List在运行时其实都是List类型。...同时正正有这个这么“坑”的机制,令到我们无法在运行期间随心所欲的获取到泛型参数的具体类型。...正如上面说的,如果直接把List>的类型传过去,但是因为运行时泛型被擦除了,所以得到的其实是List,那么后面的Gson就不知道要转成MapList这样中的泛型会被擦除掉,那么我用一个子类SubList extends List这样的话,在JVM内部中会不会把父类泛型的类型给保存下来呢...> subclass) {     Type superclass = subclass.getGenericSuperclass();     if (superclass instanceof Class

    49721

    Java高级特性之泛型

    类型擦除指的是:Java 的泛型代码在编译时,由编译器进行类型检查,之后会将其泛型类型擦除掉,只保存原生类型,如 Generics 被擦除后是 Generics,我们常用的 ListJava 的泛型实际上是由编译器实现的,将泛型类型转换为 Object 类型,在运行期间再进行状态转换。...(new Generics()); // 编译无法通过 我们会发现最后一行编译报错,至于为什么,可以如此理解:XX 是继承了 Generics 的类,List 中取出来的类一定是可以转换为...Generics,所以 get 方法没问题;而具体是什么类,我们并不知道,将父类强制转换成子类可能会造成运行期错误,所以编译器不允许这种情况; 而同理 Generics> 是下边界限定通配符, XX 是 Generics 的父类,所以: List<?

    76240

    详解泛型高级特性

    类型擦除指的是:Java 的泛型代码在编译时,由编译器进行类型检查,之后会将其泛型类型擦除掉,只保存原生类型,如 Generics被擦除后是 Generics,我们常用的 List被擦除后只剩下 List...也就是说:Java 的泛型实际上是由编译器实现的,将泛型类型转换为 Object 类型,在运行期间再进行状态转换。...(new Generics()); // 编译无法通过 我们会发现最后一行编译报错,至于为什么,可以如此理解:XX 是继承了 Generics 的类,List 中取出来的类一定是可以转换为...Generics,所以 get 方法没问题;而具体是什么类,我们并不知道,将父类强制转换成子类可能会造成运行期错误,所以编译器不允许这种情况; 而同理 Generics> 是下边界限定通配符, XX 是 Generics 的父类,所以: List<?

    58010

    java类加载常见的几种问题理解类加载机制

    ); SuperClass []s_list=new SuperClass[10]; } } 没有输出 /** * 被动引用情景3 * 静态常量在编译阶段会被存入调用类的常量池中...); //SuperClass[] s_list = new SuperClass[10]; System.out.println(ConstClass.value);...2、 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3、 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。...Java语言本身是相对安全的语言,使用Java编码是无法做到如访问数组边界以外的数据、将一个对象转型为它并未实现的类型等,如果这样做了,编译器将拒绝编译。...5.4 解析 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

    45230

    第08天Java泛型机制

    中的元素都是 Object 类型(无法约束其中的类型),所以在取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现 java.lang.ClassCastException 异常。...具体代码如下: package com.Leo.generics; import java.util.ArrayList; import java.util.HashMap; import java.util.List...在获取 Map 集合中的元素时,不需要将 books.get(id); 获取的值强制转换为 Book 类型,程序会隐式转换。...在创建 List 集合时,同样使用了泛型,因此在获取集合中的元素时也不需要将 bookList.get(i) 代码强制转换为 Book 类型,程序会隐式转换。...在获取学生姓名、年龄和性别时,不需要类型转换,程序隐式地将 Object 类型的数据转换为相应的数据类型。 注意: 泛型的类型参数只能是类类型,不能是简单类型。

    18930
    领券