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

如果引用类型是带有泛型的父类,为什么不能将对派生类的引用赋给变量?

在Java中,如果引用类型是带有泛型的父类,不能将对派生类的引用赋给变量的原因是类型不匹配。泛型是Java中的一种参数化类型,它可以在定义类、接口或方法时指定一种类型,使得代码可以更加通用和安全。

当一个类使用了泛型,例如List<T>,其中的T表示一个类型参数,可以在使用时指定具体的类型,例如List<String>。在这种情况下,List<String>List<T>的子类型,但是List<Object>不是List<T>的子类型。

当一个引用类型是带有泛型的父类时,例如List<T>,它只能接受相同泛型类型的子类引用赋值,而不能接受不同泛型类型的子类引用赋值。这是因为Java的泛型是不可变的,即使两个泛型类型之间存在继承关系,它们也不是父子关系。

例如,假设有一个List<Object>的变量list,它是一个带有泛型的父类。如果将一个List<String>的引用赋给list,那么在编译时就会发生类型不匹配的错误,因为List<String>不是List<Object>的子类型。

解决这个问题的方法是使用通配符?来表示未知类型。可以将List<?>的引用赋给List<Object>的变量,因为List<?>表示可以接受任意类型的列表。

总结起来,不能将对派生类的引用赋给带有泛型的父类变量是因为泛型是不可变的,即使两个泛型类型之间存在继承关系,它们也不是父子关系。可以使用通配符?来表示未知类型,从而解决类型不匹配的问题。

腾讯云相关产品和产品介绍链接地址:

请注意,以上仅为腾讯云的一些相关产品,其他云计算品牌商也提供类似的产品和服务。

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

相关·内容

C# 学习笔记(15)—— C# 4.0

,如数字、常量字符串、null、const 成员和枚举成员等 参数数组不能为可选参数 用ref或out关键字标识参数不能被设置为可选参数 命名实参 当调用带有可选参数方法时,如果我们省略了一个参数,...,这样编译器将判断参数名称是否正确,然后将指定对应参数,从而达到只省略第二个参数目的 可变性 在 C# 2.0 中,并不具备可变形,这种可变形指协变性和逆变性。...引用类型数组也存在这种从子类引用引用转化,例如string[]可以转换为object[] string[] strs = new string[3]; object[] objs = strs;...C# 2.0 确实是不支持,但因为有了这样需求,微软便适应地做出了改进,在 C# 4.0 中引入了协变性和逆变性 协变性 协变性指的是类型参数可以从一个派生类隐式地转换为基 C# 4.0...,反之则失败 逆变性 逆变性类型参数可以从一个基隐式地转换为派生类,C# 4.0 引入in关键字来标记参数,以示其支持逆变性,下面以 .Net 库中接口public interface

23620

初探 TypeScript函数基本类型接口内置对象

Red,Green,Blue} let c:Color = Color.Green 复制代码 any 在编程阶段还不清楚类型变量指定一个类型,值可能动态输入,但是 Object 类型变量值允许你任意值...;一种特殊变量,只用于表示类型而不是值 型函数 function identity(arg:T):T { return arg; } let output = identity(arg:T):T} = identity 复制代码 可以使用带有调用签名对象字面量来定义型函数,我们可以将对象字面量拿出来作为一个接口,将一个参数当做整个接口一个参数...new GeneriNumber() 复制代码 有两个部分:静态部分和实例部分,实例部分,所以静态属性不能使用这个类型,定义接口来描述约束条件 约束 interface..., 继承之后可以使用方法, 也可以重写方法; implements 实现多个接口, 接口方法一般为空, 必须重写才能使用 ?

7.3K31
  • Java基础八股文(背诵版)

    覆盖:覆盖派生类重写基方法,使用基指向其子类实例对象,或接口引用变量指向其实现实例对象,在程序调用运行期根据引用变量所指具体实例对象调用正在运行那个对象方法,即需要到运行期才能确定调用哪个方法...静态内部类不能与外部类有相同名字,不能访问普通成员变量,只能访问外部类中静态成员和静态成员方法。 为什么要把 String 设计为不可变?...== 比较引用,equals 比较内容。 如果变量基础数据类型,== 用于比较其对应值是否相等。如果变量指向对象,== 用于比较两个对象是否指向同一块存储空间。...在使用过程中,操作数据类型被指定为一个参数,这种参数类型中称为、接口中称为接口和方法中称为方法。...简述擦除 Java 编译器生成字节码不包涵信息类型信息将在编译处理被擦除,这个过程被称为擦除。 简述注解 Java 注解用于为 Java 代码提供元数据。

    44.6K2738

    Java基础-甲骨文系列

    覆盖:覆盖派生类重写基方法,使用基指向其子类实例对象,或接口引用变量指向其实现实例对象,在程序调用运行期根据引用变量所指具体实例对象调用正在运行那个对象方法,即需要到运行期才能确定调用哪个方法...简述 ,即“参数化类型”,解决不确定对象具体类型问题。在编译阶段有效。...在使用过程中,操作数据类型被指定为一个参数,这种参数类型中称为、接口中称为接口和方法中称为方法。...简述擦除 Java编译器生成字节码不包涵信息类型信息将在编译处理时被擦除,这个过程被称为擦除。...拆箱装箱原理 装箱过程通过调用包装器valueOf方法实现,将原值对应

    84010

    C# .NET面试系列二:面向对象

    struct 不支持继承,不能作为基。结构体密封不能被继承。装箱和拆箱:class 在进行值类型引用类型转换时会发生装箱(Boxing)和拆箱(Unboxing)。...(如果有):如果存在继承关系,首先执行静态构造函数。...重写涉及到基派生类之间关系,基虚方法在派生类中被重新实现。重载编译时多态性,根据调用时提供参数类型来确定调用哪个方法。重写运行时多态性,根据对象实际类型来确定调用哪个方法。...重载和重写分别应用于不同场景,取决于你解决问题内提供多个版本方法(重载)还是在继承体系中提供对基虚方法新实现(重写)。17. 静态方法可以访问非静态变量吗?如果不可以为什么?...GetEnumerator 方法返回一个实现 IEnumerator 接口或其版本 IEnumerator 迭代器对象。

    18910

    面向对象编程基础2(干货)

    概念1:继承 1.C#语言继承方式为单继承。继承中代表,继承者称为派生类。 2.隐藏方法:如果想在派生类中定义一个和基中重名方法,但是实现过程不一样,这中操作叫隐藏方法。...注意:为屏蔽那个方法,派生类中声明名称和类型、及函数名都要与对应方法相同,且声明这个方法时候要用new关键字。 ? ?...多态--通过指向派生类(统一)调用,调用虚函数,会根据引用所指向派生类实际类型,调用派生类同名重写函数,即为多态(个性张扬)。...概念4: 1.:可理解为一个模子,装入类型材料,就可以塑造出想要产品。 2.语法展示: ? ? 3.使用原因: ? 4.实例化过程 ?...6.方法:方法就是方法模型,给定具体类型,就可以实例化出一个操作该类型具体方法。(方法可存在于和普通中) 7.语法展示: ? ? ? 8.约束:约束就是控制控制器。

    1.1K20

    .net 读书笔记

    继承称为子类、派生类,而被继承称为、基或超。通过继承,使得子类具有属性和方法,同时子类也可以通过加入新属性和方法或者修改属性和方法建立新层次。...在.NET中,WeakReference 用于表示弱引用,通过其 Target 属性来表示要追踪对象,通过其值变量来创建目标对象引用. 4.尽可能以 using 来执行资源清理。...5.推荐使用集合来代替非集合。 6.初始化时最好为集合对象指定大小。 7.特定类型 Array 性能优于 ArrayList。...作为约束,用于在声明中约束可能用作类型参数参数类型。 MSDN 中定义:new 约束指定声明中任何类型参数都必须有公共无参数构造函数。...当创建类型新实例时,将此约束应用于类型参数。

    63610

    C#学习笔记三: C#类型详解..

    上面说怎么区分哪些C#值类型和C#引用类型,而使用上也是有区别的。所有值类型数据都无法为null(这里可空类型可以为空),声明后必须以初值;引用类型才允许 为null。...1.3引用类型中嵌套定义值类型 如果字段类型类型,它将作为引用类型实例一部分,被分配到托管堆中。但那些作为局部变量 (例如下列代码中c变量)类型,则仍然会分配到线程堆栈中。...2,两大类型转换--装箱与拆箱 类型转换主要分为以下几种方式: 1, 隐式类型转换:由低级别类型向高级别类型转换过程。例如:派生类可以隐式转换为它,装箱过程就输入这种隐式类型转换。...拆箱过程也可以具体分为3个步骤: (1)检查实例:首先检查要进行拆箱操作引用类型变量是否为null,如果为null则抛出空指针异常,如果不为null则继续减产变量是否合拆箱后类型同一类型,若不是则会抛出...3、而带有静态构造函数静态字段,只有在引用时候才进行初始化。

    1.3K140

    读完某C++神作,我只记下了100句话

    C++强制要求指向const对象指针也必须具有const特性,可以把非const对象地址const指针。...const指针:int *const cur = &cuss; 指向int变量指针,并且本身不能修改。...int() {return data;dataInteger私有成员}】 virtual函数希望派生类重新定义函数,希望派生类继承函数不能为虚函数。...如果知道基派生类转换【这种转换地址派生类指针】安全【就是说心里清楚基指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...代码两个原则:1.模板形参const引用 2.函数体中只用<比较 模板形参数量自由,可以设定返回值为一个形参。

    1.4K20

    C#要点

    3.10尽量使用属性而不是字段   3.11 接口中属性 4   4.1string.Join方法不能识别 5 集合   5.1 关于集合标准查询运算符   5.2 提高集合插入性能...3.1 配置文件中使用静态字段或静态属性 静态变量在静态变量所属初次使用时被初始化,当静态字段被初始化后,之后每次调用获得值都是初始化时静态字段值,除非在这个过程中显示地静态字段赋值。...3.2 虚方法中不要含有业务逻辑 使用virtual修饰符修饰方法,那么这个方法就可以在派生类中重写,如果原来方法包含业务逻辑,派生类重写这个方法后,由于派生类虚方法完全覆盖,导致虚方法中业务逻辑永远不会被执行...如果有几个重载构造函数而子类未指定构造函数,那么将调用哪一个构造函数呢? 对于继承中涉及到构造函数调用问题比较复杂。 首先,构造函数先于子类构造函数被调用。...4.1string.Join方法不能识别 string JoinStr(T set) {   Return string.Join(“,”,set); } 上面这个方法不能正确返回拼接后字符串

    1.1K50

    【C++】继承

    当然可以,这个问题其实我们之前文章里讲过。 这里会发生一个隐式类型转换嘛,会产生一个临时变量,临时变量值就是y转换为int类型值,然后再把这个临时变量x。...另外临时变量具有常性,如果引用的话还得加const嘛。 2.1 派生类对象赋值对象 那大家看这样可以吗?...2.2 派生类对象赋值对象引用 那除此之外呢,还可以这样搞: 还可以Person对象引用,即子类对象可以赋值对象引用。...那对它解引用就相当于拿到一个对象,这个对象可以认为从子类对象中切出来属于那一部分。 2.4 基对象不能赋值派生类对象 我们刚才是把派生类对象赋值,那反过来可以吗?...基可以赋值派生类吗? 不行,基对象不能赋值派生类对象。

    12210

    十问,你能扛住吗?

    问题二:从ArrayList角度说一下为什么要用? 答: 在Java增加机制之前就已经有一个ArrayList,这个ArrayList概念使用继承来实现。...问题四:说说方法定义和使用 答: 方法可以定义在普通中,也可以定义在中,类型变量放在修饰符后面,返回类型前面。...这里需要注意和Java数组之间区别,可以将一个Rapper[]数组一个类型为Singer[]变量: Rapper[] rappers = ...; Singer[] singer = rappers...通配符限定与类型变量限定非常相似,但是通配符类型还有一个附加能力,即可以指定一个超类型限定: ? super Rapper 这个通配符限制为Rapper所有为什么要这么做呢?...总结一下: 带有类型限定通配符可以向对象写入,带有类型限定通配符可以从对象读取。 问题九:在虚拟机中是什么样呢? 答: 虚拟机没有类型对象,所有的对象都属于普通

    1.1K10

    《逆袭进大厂》第三弹之C++提高篇79问79答

    带有默认构造函数如果一个没有任务构造函数派生类派生自一个带有默认构造函数基,那么该派生类会合成一个构造函数调用上一层基默认构造函数; 3) 带有一个虚函数 4) 带有一个虚基...如果派生类中给出了基纯虚函数实现,则该派生类就不再抽象了,它是一个可以建立对象具体。 抽象不能定义对象。一个纯虚函数不需要(但是可以)被定义。...1) 向上类型转换 将派生类指针或引用转换为基指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换安全。...类似的,使用未命名变量一个对象时,调用移动赋值操作; 5) Example6 (Example6&& x) : ptr(x.ptr) { x.ptr = nullptr;...举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量地址;表达式b+c、函数int func()返回值右值,在其被赋值某一变量前,我们不能通过变量名找到它,&

    2.2K30

    C++学习知识点

    使用const修饰引用表示常引用,即引用变量变量,这样一来,防止在函数中对常引用修改,多用于修饰常对象。如果将值调用形参声明为常量,则没有多大使用价值。...为什么类型指针在被子类对象赋值后不能访问子类成员函数呢?...对象另外一个对象引用或者指针时,如何传递 当对象另外一个对象引用或者对象时候,将调用被赋值拷贝构造函数。此时就存在深拷贝和浅拷贝。...深拷贝存在情况就是在成员中有非基本数据类型变量时,比如指针,数组或者引用。...当对象另外指针时候,指针存放就是对象首地址,只不过此时系统会进行类型转换。

    1.7K20

    C++区别于其他语言知识点总结

    T c) { if(b > a) a = b; if(c > a) a = c; } //如果不使用函数模板 实现调用 你需要使用指针和2倍数量参数再加上一个switch分支判断语句...//静态变量又称变量 普通变量也称实例变量 //普通变量 属于对象 //静态变量不能在构造函数中初始化 只能在全局初始化(外体) //int Box:: height = 111; //初始化后才算定义完毕...dd = c + d; dd = d + c; //类型转换函数实现Complex与double类型变量相加 ,返回值为double 19.继承与派生 声明派生类一般形式为: class 派生类名...//在有构造函数、子对象情况下,如果创建当前对象 //则构造函数执行顺序为:构造函数,子对象构造函数,当前对象构造函数。...子类隐藏方法 如果多态方法(虚方法):子类覆盖方法 //在析构函数之前加virtual //虚析构函数,解决子类对象赋值指针后,当delete指针时,无法调用子类析构函数问题

    909100

    Java基础系列(三十七):继承,通配符,反射

    这里需要注意和Java数组之间区别,可以将一个 Apple[]数组一个类型为 Fruit[]变量: Apple[] apples = ......通配符限定与类型变量限定非常相似,但是通配符类型还有一个附加能力,即可以指定一个超类型限定: ? super Apple 这个通配符限制为 Apple所有为什么要这么做呢?...带有类型限定通配符行为与子类型限定通配符行为完全相反,可以为方法提供参数,但是却不能获取具体值,即访问器不安全,而更改器方法安全: ?...总结一下,带有类型限定通配符可以想对象写入,带有类型限定通配符可以从对象读取。 还可以使用无限定通配符,例如, Pair。...反射与 反射允许我们在运行时分析任意对象,但是如果对象是实例,关于类型参数则得不到太多信息,因为它们会被擦除。

    61630

    C#基础知识系列七(base、this、new、override、abstract、virtual、static)

    (和override有区别,下面进行讲解) 三、new 约束 new 约束指定声明中任何类型参数都必须有公共无参数构造函数。 如果要使用 new 约束,则该类型不能为抽象类型。...4.抽象不能定义为密封(sealed),抽象方法不能使用virtual、static、private修饰符 5.如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象。...情况2:在基中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例调用中,该虚方法使用派生重写方法。...2、如果存在多个静态,那么初始化静态成员顺序会根据引用顺序,先引用先进行初始化,但如果静态成员初始化依赖于其他静态成员,则会先初始化被依赖静态成员。   ...3、而带有静态构造函数静态字段,只有在引用时候才进行初始化。

    64020

    【C++】继承

    ---- 二、基派生类对象赋值 在继承关系中,派生类对象可以直接赋值对象/基指针/基引用,而不产生类型转换。...b,而是编译器会先根据 a 创建一个 double 类型临时变量 tmp,然后将 tmp 赋值 b; 对于 rb 来说也是一样,但是 rb 引用类型,因为对于引用和指针来说,权限只能放大和平移...,所以当我们对其进行引用时,1会先一个临时变量,然后我们再对这个临时变量进行引用;同时由于临时变量具有常性,所以我们需要使用 const 修饰; 派生类对象赋值对象不存在类型转换 现在,我们就能真正理解...“派生类对象可以直接赋值对象/基指针/基引用,而不产生类型转换” 是什么意思了 – 派生类对象对象时中间不会参数临时变量,所以基对象可以直接引用/指向派生类对象,而不需要使用...;(即只能向上转,不能向下转) 2、基指针或者引用可以通过强制类型转换赋值派生类指针或者引用

    87700

    C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案

    错题解析:内联函数在编译时候已经做好将对函数代码替换嵌入到对应位置,适用于代码较少函数。 宏定义简单替换变量如果定义有参数函数形式,参数不做类型校验。...正确答案: 内联函数在编译时候已经做好将对函数代码替换嵌入到对应位置,适用于代码较少函数。 宏定义简单替换变量如果定义有参数函数形式,参数不做类型校验。...子类继承大部分资源,不能继承有构造函数,析构函数,拷贝构造函数,operator=函数,友元函数等等 13、 什么引用”?申明和使用“引用”要注意哪些问题?...重写:当子类重新定义了虚函数后,指针根据给它不同子类指针,动态调用属于子类该函数,这样函数调用在编译期间无法确定(调用子类虚函数地址无法给出)。...重写:当子类重新定义了虚函数后,指针根据给它不同子类指针,动态调用属于子类该函数,这样函数调用在编译期间无法确定(调用子类虚函数地址无法给出)。

    2.1K20

    面试系列之-JAVA剖析(JAVA基础)

    一、概述 1. 什么为什么要使用,即“参数化类型”。一提到参数,最熟悉就是定义方法时有形参列表,普通方法形参列表中,每个形参数据类型确定,而变量一个参数。...而静态变量和静态方法在加载时已经初始化,直接使用名调用;在类型参数未确定时,静态成员有可能被调用,因此类型参数不能在静态成员中使用。...其实在创建一个对象时, Java 编译器先检查代码中传入 数据类型,并记录下来,然后再对代码进行编译,编译同时进行类型擦除;如果需要对被擦除了信息对象进行操作,编译器会自动将对象进行类型转换...在引入通配符之后,我们便得到了一个在逻辑上可以表示为某一类型参数范围引用类型。...List 在逻辑上所有 List ,你可以把 List、 List 等集合赋值 List 引用;而 List 只代表了自己这个集合

    32920
    领券