Java自学-泛型 泛型转型

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);

    }

}

原文地址:https://www.cnblogs.com/jeddzd/p/12228758.html

时间: 2024-11-09 03:22:34

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

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

Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的对象的类型 class Holder1 { private Circle a; public Holder1(Circle a) { this.a = a; } Circle get() { return a; } } 上面的类的可重用性不怎么样,无法持有其他类型的任何对象,下面通过持有Object

java中的泛型(转)

什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象. 因为 Map.get(

java中的泛型的使用与理解

什么是泛型? 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写 体验泛型代码时定义一些可变部份,那些部份在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型.泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念. 定义: 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型

Java笔记(8)-泛型与集合框架

泛型与集合框架 泛型 泛型类 泛型类声明对象 示例 泛型接口 示例 泛型的目的 链表 LinkedList E 泛型类 常用方法 遍历链表 示例 排序和查找 示例 洗牌和旋转 堆栈 示例 散列映射 HashMap KV 泛型类 常用方法 遍历散列映射 基于散列映射的查询 示例 树集 TreeSetE泛型类 节点的大小关系 TreeSet类常用方法 示例 树映射 泛型与集合框架 组织数据之结构及相关操作. 泛型 泛型(Generics)是在JDK1.5中推出的,其主要目的是可以建立具有类型安全的集

Java开发知识之Java中的泛型

Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类.所以定义泛型的时候,设计长须的话传入的值与返回的值都是Object类型为主.如果是用具体的实例,就要进行转换了.具体参考向上转型,跟向下转型. JDK 1.5版本才有了泛型机制. 语法如下: class 类名<T >{ public T a; public T b; public void Set

Java中的泛型 --- Java 编程思想

前言 ? 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Java编程思想>这本书中泛型章节进行了研读.可惜遗憾的是,自己没有太多的经验,有些东西看了几次也是有点懵.只能以后有机会,再进行学习了.但是自己也理解了挺多的.下面就是自己对于泛型的理解与感悟.如有不对,望指出. 概念 由来: Java 一开始设计之初是没有泛型这个特性的,直到jdk 1.5中引入了这个特

Java 中的泛型

泛型的概念 泛型: 泛型是一种末知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型 泛型也可以看成是一个变量用来接收数据类型 E e:Element元素 T t:Type类型 是否使用泛型的对比 不使用泛型 /** * 创建集合对象,不使用泛型 * 好处: * 集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据. * 弊端: * 不安全,会引发异常 */ 好处(举例): public class Demo01Generic { public static void

泛型及java中的泛型

当作笔记整理的~~~ 首先,引出堆对象这个概念. 什么是堆对象,就是程序在运行过程中可以随时建立或者删除的对象,可以用new运算符(或malloc函数)或者delete运算符(或free函数).泛型可以看作是一类堆对象. 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明. 各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型. 泛型的定义主要有两种:1.在程序编

Java中的泛型 (上) - 基本概念和原理

本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以深刻理解容器类.那,泛型到底是什么呢? 什么是泛型? 一个简单泛型类 我们通过一个简单的例子来说明泛型类的基本概念.实现原理和好处. 基本概念 我们直接来看代码: public class Pair<T> { T first; T second; public Pair(T first, T se