Java 中的子类泛型转型成父类泛型

步骤 1 : 对象转型

根据面向对象学习的知识,子类转父类 是一定可以成功的

package generic;

import charactor.ADHero;
import charactor.Hero; public class TestGeneric { public static void main(String[] args) { Hero h = new Hero();
ADHero ad = new ADHero();
//子类转父类
h = ad;
} }

步骤 2 : 子类泛型转父类泛型

既然 子类对象 转 父类对象是可以成功的,那么子类泛型转父类泛型能成功吗?

如代码

hs的泛型是父类Hero

adhs 的泛型是子类ADHero

那么 把adhs转换为hs能成功吗?

package generic;

import java.util.ArrayList;

import charactor.ADHero;
import charactor.Hero; public class TestGeneric { public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>(); //子类泛型转父类泛型
hs = adhs;
} }

步骤 3 : 假设可以转型成功

假设可以转型成功

引用hs指向了ADHero泛型的容器

作为Hero泛型的引用hs, 看上去是可以往里面加一个APHero的。

但是hs这个引用,实际上是指向的一个ADHero泛型的容器

如果能加进去,就变成了ADHero泛型的容器里放进了APHero,这就矛盾了

所以子类泛型不可以转换为父类泛型

package generic;

import java.util.ArrayList;

import charactor.ADHero;
import charactor.APHero;
import charactor.Hero; public class TestGeneric { public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>(); //假设能转换成功
hs = adhs; //作为Hero泛型的hs,是可以向其中加入APHero的
//但是hs这个引用,实际上是指向的一个ADHero泛型的容器
//如果能加进去,就变成了ADHero泛型的容器里放进了APHero,这就矛盾了
hs.add(new APHero());
} }

练习: 父类泛型能否转换为子类泛型?

上面使用反证法分析了,子类泛型不能转换为父类泛型。

那么父类泛型又能否转换成子类泛型? 为什么?

package generic;

import java.util.ArrayList;

import charactor.ADHero;
import charactor.Hero; public class TestGeneric { public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>(); //父类泛型转子类泛型,能否成功?为什么?
adhs = hs; } }

答案:

假设能成功

这个时候adhs实际上指向的是泛型是Hero的容器,而这个容器里可能放的是一个APHero

而根据泛型,直接取出来就转型成了ADHero

所以就变成了APHero转型成ADHero,这是矛盾的。

所以反推,父类泛型不能转型为子类泛型

package generic;

import java.util.ArrayList;

import charactor.ADHero;
import charactor.Hero; public class TestGeneric { public static void main(String[] args) {
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>(); //假设能成功
adhs = hs; //这个时候adhs实际上指向的是泛型是Hero的容器,而这个容器里可能放的是一个APHero
//而根据泛型,直接取出来就转型成了ADHero
//所以就变成了APHero转型成ADHero,这是矛盾的。
ADHero ad =adhs.get(0); } }

Java自学-泛型 泛型转型的更多相关文章

  1. Java自学手记——泛型

    泛型在集合中的应用 泛型在集合经常能看到,有两个好处:1.把运行时出现 的问题提前至了编译时:2.避免了无谓的强制类型转换. 用法:两边泛型的类型必须相同,可允许一边不写,只是为了兼容性,并不推荐. ...

  2. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug

    集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值. ...

  3. java中的泛型的使用与理解

    什么是泛型? 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写 体验泛型代码时定义一些可变部份,那些部份在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样 ...

  4. [JavaCore]JAVA中的泛型

    JAVA中的泛型 [更新总结] 泛型就是定义在类里面的一个类型,这个类型在编写类的时候是不确定的,而在初始化对象时,必须确定该类型:这个类型可以在一个在里定义多个:在一旦使用某种类型,在类方法中,那么 ...

  5. 【Java基础】泛型的一些总结

    什么是泛型 泛型其实可以理解为一种广泛的类型,啥类型都型,当然,这种泛是指定义时可以广泛,但是使用时必须确定类型.也就是说,当不清楚未来使用哪种类型时,定义为泛型.可以支持泛型类,泛型接口,泛型方法, ...

  6. Java 中的泛型详解-Java编程思想

    Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的 ...

  7. java中的泛型(转)

    什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...

  8. Java 泛型 泛型数组

    Java 泛型 泛型数组 @author ixenos 先给结论 不能(直接)创建泛型数组 泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair<T>[]为Pa ...

  9. Java 泛型 泛型代码和虚拟机

    Java 泛型 泛型代码和虚拟机 @author ixenos 类型擦除.原始类型.给JVM的指令.桥方法.Java泛型转换的事实 l  类型擦除(type erasure) n  Java泛型的处理 ...

随机推荐

  1. Web移动前端开发-——rem+less+媒体查询,rem+flexble.js+媒体查询

    实际开发搞搞起来!!!! rem适配方案 媒体查询+rem+less 基础知识铺垫 第一步,我们需要拿到设计稿,安装设计稿的要求来设置一个合适的html字体大小. 第二步,计算元素大小的取值 页面re ...

  2. android导入项目build错误

    android studio apply script build.gradle 卡死 buildscript { repositories { maven{ url 'http://maven.al ...

  3. ubuntu12.04 eclipse安装PyDev

    在ubuntu软件中心安装的eclipse版本为3.7,install new software时,搜索出来的PyDev版本较高(5.6...): 高版本的PyDev要求较高版本的eclipse.详情 ...

  4. 吴裕雄--天生自然C++语言学习笔记:C++ 预处理器

    预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理. 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前.预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾 ...

  5. poj 3262 Protecting the Flowers 贪心 牛吃花

    Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11402   Accepted ...

  6. ROS2学习日志:TurtleSim测试日志(基于ROS2 Eloquent Elusor)

    TurtleSim测试日志(基于ROS2 Eloquent Elusor) 1.ros2 run 1.1 ros2 run turtlesim turtlesim_node --ros-args -- ...

  7. SOA--基于银行系统实例分析

    阅读以下关于 Web 系统设计的叙述 [说明] 某银行拟将以分行为主体的银行信息系统,全面整合为由总行统一管理维护的银行信息系统,实现统一的用户账户管理.转账汇款.自助缴费.理财投资.贷款管理.网上支 ...

  8. Loading PDSC Debug Description Failed for STMicroelectronics STM32Lxxxxxxx”

    今天在调程序的时候遇到这个问题 解决办法:将安装在MDK下面的文件属性由只读去掉: 成功!可以下载.

  9. code first 和数据库映射

  10. DBUtils模版CRUD

    准备:导包 1.创建c3p0-config.xml配置文件放在src下 <?xml version="1.0" encoding="UTF-8"?> ...