泛型类、泛型方法及泛型应用

泛型类、泛型方法及泛型应用

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。

 

Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的任意化任意化带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

 

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。

 

蓝桥软件学院的马洋老师讲解了泛型的相关内容:

 

规则限制:

1、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。

2、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为有界类型

3、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");

泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。在此给出我曾经了解泛型时候写出的两个例子(根据看的印象写的),实现同样的功能,一个使用了泛型,一个没有使用,通过对比,可以很快学会泛型的应用,学会这个基本上学会了泛型70%的内容。

 

例子一:使用了泛型

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

class Gen<T> {

    private T ob; // 定义泛型成员变量

 

    public Gen(T ob) {

        this.ob = ob;

    }

 

    public T getOb() {

        return ob;

    }

 

    public void setOb(T ob) {

        this.ob = ob;

    }

 

    public void showType() {

        System.out.println("T的实际类型是: " + ob.getClass().getName());

    }

}

 

public class GenDemo {

    public static void main(String[] args) {

        // 定义泛型类Gen的一个Integer版本

        Gen<Integer> intOb = new Gen<Integer>(88);

        intOb.showType();

        int i = intOb.getOb();

        System.out.println("value= " + i);

        System.out.println("----------------------------------");

        // 定义泛型类Gen的一个String版本

        Gen<String> strOb = new Gen<String>("Hello Gen!");

        strOb.showType();

        String s = strOb.getOb();

        System.out.println("value= " + s);

    }

}

例子二:没有使用泛型

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

class Gen2 {

    private Object ob; // 定义一个通用类型成员

 

    public Gen2(Object ob) {

        this.ob = ob;

    }

 

    public Object getOb() {

        return ob;

    }

 

    public void setOb(Object ob) {

        this.ob = ob;

    }

 

    public void showTyep() {

        System.out.println("T的实际类型是: " + ob.getClass().getName());

    }

}

 

public class GenDemo2 {

    public static void main(String[] args) {

        // 定义类Gen2的一个Integer版本

        Gen2 intOb = new Gen2(new Integer(88));

        intOb.showTyep();

        int i = (Integer) intOb.getOb();

        System.out.println("value= " + i);

        System.out.println("---------------------------------");

        // 定义类Gen2的一个String版本

        Gen2 strOb = new Gen2("Hello Gen!");

        strOb.showTyep();

        String s = (String) strOb.getOb();

        System.out.println("value= " + s);

    }

}

运行结果:

两个例子运行Demo结果是相同的,控制台输出结果如下:

T的实际类型是:

java.lang.Integer

value= 88

----------------------------------

T的实际类型是: java.lang.String

value= Hello Gen!

Process finished with exit code 0

看明白这个,以后基本的泛型应用和代码阅读就不成问题了。

 

 

泛型介绍:

 

 

一. 自定义泛型接口、泛型类和泛型方法

 

在泛型接口、泛型类和泛型方法的定义过程中,我们常见的如TEKV等形式的参数常用于表示泛型形参,由于接收来自外部使用时候传入的类型实参。那么对于不同传入的类型实参,生成的相应对象实例的类型是不是一样的呢?

 

 

 1 public class GenericTest {

 2

 3     public static void main(String[] args) {

 4

 5         Box<String> name = new Box<String>("corn");

 6         Box<Integer> age = new Box<Integer>(712);

 7

 8         System.out.println("name class:" + name.getClass());      // com.qqyumidi.Box

 9         System.out.println("age class:" + age.getClass());        // com.qqyumidi.Box

10         System.out.println(name.getClass() == age.getClass());    // true

11

12     }

13

14 }

 

 

究其原因,在于Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,【在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,】也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。

 

对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。

 

 

 

.类型通配符

 

1.类似于Box<Number>Box<Integer>是否可以看成具有父子关系的泛型类型呢?

 

 public class GenericTest {

 2

 3     public static void main(String[] args) {

 4

 5         Box<Number> name = new Box<Number>(99);

 6         Box<Integer> age = new Box<Integer>(712);

 7

 8         getData(name);

 9         

10         //The method getData(Box<Number>) in the type GenericTest is

11         //not applicable for the arguments (Box<Integer>)

12         getData(age);   // 1

13

14     }

15     

16     public static void getData(Box<Number> data){

17         System.out.println("data :" + data.getData());

18     }

19

 

显然,通过提示信息,我们知道Box<Number>在逻辑上不能视为 Box<Integer>的父类。

 

 

本文由蓝桥软件学院(http://xueyuan.lanqiao.org)原创,转载请注明出处。

 

转载于:https://www.cnblogs.com/lanshen/p/6379107.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exynos4412 中断驱动开发(二)—— 中断处理流程分析

前面已经学习了中断的注册过程&#xff0c;下面由一张流程图来看一下当中断发生时的处理流程&#xff1a; 中断发生之后处理流程 a -- 具体的CPU architecture相关模块进行现场保护&#xff0c;然后调用machine driver执行对应的中断处理handler; b -- machine driver对应中断处…

用For循环加cat按顺序合并文件

工作目录下面有mydoc1.txt&#xff0c;mydoc2.txt...mydoc41.txt&#xff0c;本来想用sed排列依次取值排序&#xff0c;然后用cat来合并这些文件&#xff0c;发现达不到预期效果&#xff0c;合并令如下所示&#xff1a;ls -lF *.txt | sed -n /mydoc1/,/mydoc41/p | xargs -i …

Python 函数装饰器

装饰器(Decorators)是 Python 的一个重要部分。简单地说&#xff1a;他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短&#xff0c;也更Pythonic&#xff08;Python范儿&#xff09;。大多数初学者不知道在哪儿使用它们&#xff0c;所以我将要分享下&#xff0c;…

vim永久取消空格颜色

这是无意中发现的 vim 随便一个文件的时候空格变成某种颜色,感觉太显眼了 而:set nohsl只能一次修改 而且在执行:set nu 下是不可执行 我们只需在编辑中执行 :.,s/hsl/nohsl/gc转载于:https://www.cnblogs.com/spaceport/p/6379435.html

Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程

一、中断基础概念 所谓中断&#xff0c;指CPU在执行程序的过程中&#xff0c;出现了某些突发事件即待处理&#xff0c;CPU必须暂停当前的程序。转去处理突发事件&#xff0c;处理完毕后CPU又返回原程序被中断的位置并继续执行。 1、中断分类 a -- 内部中断和外部中断 根据中断的…

调试与分析

一、获取内核转储 大多数Linux发行版默认关闭内核转储功能&#xff0c;可使用 ulimit -c 查看&#xff0c;-c 表示内核转储文件的大小限制&#xff0c;如果为0&#xff0c;表示未开启。 1、可设置为 ulimit -c unlimited 表示无限制&#xff0c;或设置为其它数值&#xff0c;单…

CSS选择器学习笔记

在 CSS 中&#xff0c;选择器是一种模式&#xff0c;用于选择需要添加样式的元素。 “CSS” 列指示该属性是在哪个 CSS 版本中定义的。&#xff08;CSS1、CSS2 还是 CSS3。&#xff09; 选择器例子例子描述CSS.class.intro选择 class“intro” 的所有元素。1#id#firstname选择…

rubymine 调试 redmine

1、安装debase和ruby-debug-ide包。&#xff08;注意版本&#xff0c;rubymine 8.0.2下&#xff0c;bitnami下的版本需安装debase -v 0.2.1版本&#xff0c;网上有文章说用debase -v 0.2.2beta6。容易在rubymine启动调试时出现找不到ruby-debug-ide等错误提示&#xff09; 启动…

Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O

阻塞和非阻塞访问、poll() 函数提供了较多地解决设备访问的机制&#xff0c;但是如果有了异步通知整套机制就更加完善了。 异步通知的意思是&#xff1a;一旦设备就绪&#xff0c;则主动通知应用程序&#xff0c;这样应用程序根本就不需要查询设备状态&#xff0c;这一点非常类…

判断链表是否有环

链表有环的情况一般是链表的尾指向前面的节点而不是null&#xff0c;如head->node1->node2->node3->node4->tail->node2&#xff0c;该链表存在环。判断环是否存在可以借助两个指针&#xff0c;一个指针每次迭代只移动一步&#xff0c;第二个指针每次迭代移动…

Python 爬虫进阶五之多线程的用法

我们之前写的爬虫都是单个线程的&#xff1f;这怎么够&#xff1f;一旦一个地方卡到不动了&#xff0c;那不就永远等待下去了&#xff1f;为此我们可以使用多线程或者多进程来处理。 首先声明一点&#xff01; 多线程和多进程是不一样的&#xff01;一个是 thread 库&#xff0…

Tomcat8 连接池

1、所有的tomcat项目共用一个连接池配置 1.1 修改conf->context.xml文件&#xff0c;在Context节点下配置 <Resource name"jdbc/myDataSource" type"javax.sql.DataSource" driverClassName"com.microsoft.sqlserver.jdbc.SQLServerDriver"…

Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O

在前面学习网络编程时&#xff0c;曾经学过I/O模型 Linux 系统应用编程——网络编程&#xff08;I/O模型&#xff09;&#xff0c;下面学习一下I/O模型在设备驱动中的应用。 回顾一下在Unix/Linux下共有五种I/O模型&#xff0c;分别是&#xff1a; a -- 阻塞I/O b -- 非阻塞I/O…

3.改变 HTML 内容

①xdocument.getElementById("demo") //查找元素 ②x.innerHTML"Hello JavaScript"; //改变内容 <!DOCTYPE html><html><body> <h1>我的第一段 JavaScript</h1> <p id"demo">JavaScript 能改变 HTML 元素的…

Python 爬虫进阶六之多进程的用法

python 中的多线程其实并不是真正的多线程&#xff0c;并不能做到充分利用多核 CPU 资源。 如果想要充分利用&#xff0c;在 python 中大部分情况需要使用多进程&#xff0c;那么这个包就叫做 multiprocessing。 借助它&#xff0c;可以轻松完成从单进程到并发执行的转换。mult…

DEFINE_PER_CPU

转自 http://www.unixresources.net/linux/clf/linuxK/archive/00/00/47/91/479165.html 首先&#xff0c;在arch/i386/kernel/vmlinux.lds中有 /*will be free after init*/ .ALIGN(4096); __init_begin.; /*省略*/ .ALIGN(32); __per_cpu_start.; .data.percpu:{*(.data.perc…

HDU 1213 How Many Tables(并查集模板)

http://acm.hdu.edu.cn/showproblem.php?pid1213 题意&#xff1a; 这个问题的一个重要规则是&#xff0c;如果我告诉你A知道B&#xff0c;B知道C&#xff0c;这意味着A&#xff0c;B&#xff0c;C知道对方&#xff0c;所以他们可以留在一个桌子。例如&#xff1a;如果我告诉你…

Linux 设备驱动的并发控制

Linux 设备驱动中必须要解决的一个问题是多个进程对共享的资源的并发访问&#xff0c;并发的访问会导致竞态&#xff0c;即使是经验丰富的驱动工程师也常常设计出包含并发问题bug 的驱动程序。 一、基础概念 1、Linux 并发相关基础概念 a -- 并发&#xff08;concurrency&#…

Python爬虫入门一综述

网络爬虫是一种自动抓取万维网信息的程序。 学习python爬虫&#xff0c;需要学习以下知识&#xff1a; python基础python中的urllib和urllib2库的用法python正则表达式python爬虫框架scrapypython爬虫高级功能 1.python基础 廖雪峰python教程 2.python urllib和urllib2库使…

Python爬虫学习二爬虫基础了解

1.什么是爬虫 爬虫就是进入网页自动获取数据的程序。当它进入一个网页时&#xff0c;将网页上需要的数据下载下来&#xff0c;并跟踪网页上的其他链接&#xff0c;进入新的页面下载数据&#xff0c;并继续跟踪链接下载数据。 2.URL URL&#xff0c;即统一资源定位符&#xf…