文档章节

java泛型(一)基本介绍和使用

Clarence_D
 Clarence_D
发布于 2017/05/25 00:32
字数 1024
阅读 70
收藏 0
点赞 0
评论 0

    在面向对象编程语言中,多态算是一种泛化机制。一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用多种类型的代码,这种刻板的限制对代码的约束就会很大。接下来我们先来看看一个只能持有单个对象的类。

简单泛型

class Automobile{}
public class Holder1 {
    public Automobile aa;
    public Holder1(Automobile aa){ this.aa = aa; }
    Automobile get(){ return aa; }

    public static void main(String[] args) {
        Holder1 holder1 = new Holder1(new Automobile());
        Automobile automobile = holder1.get();
        System.out.println(automobile);
    }
}

    实现完了,但是这个类的可重用性就不怎样了,它无法持有其他类型的任何对象。我们可不希望为碰到的每一个类型都编写一个新的类。在java SE5之前,我们可以让这个类直接持有Object类型的对象。

public class Holder2 {
    private Object aa;
    public Holder2(Object aa){ this.aa = aa; }
    public void set(Object aa){ this.aa = aa; }
    public Object get(){ return aa; }

    public static void main(String[] args) {
        Holder2 holder2 = new Holder2(new Automobile());
        Automobile automobile = (Automobile) holder2.get();
        holder2.set("is 张三,NOT IS Automobile");
        String str = (String) holder2.get();
        holder2.set(1);
        Integer xint = (Integer) holder2.get();
        System.out.println(automobile);
        System.out.println(str);
        System.out.println(xint);
    }
}

让我们先来看看结果

com.objects.springmvc.controllet.paradigm.Automobile@13d12d43
is 张三,NOT IS Automobile
1

    只用了一个Holder2对象,却先后三次存储了三个不同类型的对象,Holder2可以存储任何类型的对象      --------------------------------------------------------------------------------------------------------       通常情况下我们只会使用容器来存储一种类型的对象,与其使用Object,我们更喜欢暂时不指定类型,而是稍后在决定具体使用什么类型。为达到目的我们需要使用类型参数,用尖括号括住,放在类名的后面。使用这个类时在用实际的类型替换此类型参数。泛型的主要目的之一就是用来指定容器要持有什么类型的对象。

public class Holder3<T> {
    public T aa;
    public Holder3(T aa){ this.aa =aa; }
    public T get(){ return aa; }
    public void set(T aa){ this.aa = aa; }

    public static void main(String[] args) {
        Holder3<Automobile> holder3 = new Holder3<Automobile>(new Automobile());
        Automobile automobile = holder3.get();
        // holder3.set("aaa"); Error
        // holder3.set(1);     Error
        System.out.println(automobile);
    }
}

    你可以认为泛型与其他的类型差不多,只不过他们碰巧有类型参数罢了。在给大家看一个网上简单易懂的例子:

public class GenericTest {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("qqyumidi");
        list.add("corn");
        list.add(100);

        for (int i = 0; i < list.size(); i++) {
            String name = (String) list.get(i); // 1
            System.out.println("name:" + name);
        }
    }
}
/**
 * 定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,
 * 因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他
 * 编码原因,很容易出现类似于//1中的错误。因为编译阶段正常,而运行时会出
 * 现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。
 */

泛型接口

    泛型也可以应用与接口,例如生成器是一种专门负责创建对象的类。实际上是工厂方法设计模式的一种应用。在科普一点小知识:生成器创建新对象是不需要传参就可以创建,而工厂工厂方法模式一版需要参数。

interface Holder4impl<T,X>{
    void show(T t,X u);
}
public class Holder4 implements Holder4impl<String,Date>{
    @Override
    public void show(String str,Date date) {
        System.out.println(str);
        System.out.println(date);
    }

    public static void main(String[] args) {
        Holder4 showTest=new Holder4();
        showTest.show("Hello",new Date());
    }
}

运行结果

Hello
Thu May 25 00:16:33 CST 2017

泛型方法

    到目前为止,我们看到的泛型都是应用于整个类上。接下来我们来看看泛型方法的例子 

public class Holder5 {
    public static <T, U> T get(T t, U u) {
        if (u != null)
            return t;
        else
            return null;
    }
    public static void main(String[] args) {
        String str=get("Hello", "World");
        System.out.println(str);
    }
}

java泛型中T、E、K、V、?等含义

因为时间太晚的缘故,今天到此为止明天继续。

© 著作权归作者所有

共有 人打赏支持
Clarence_D
粉丝 8
博文 119
码字总数 98809
作品 0
天津
程序员
Kotlin 泛型 VS Java 泛型

建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言中较难理解的一个部分。Kotlin 泛型的本质也是参数化类型,并且提供了编译时强类型检查,实际上也是伪...

JohnnyShieh
06/11
0
0
【转】Java语法糖的味道:泛型与类型擦除

泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类...

mj4738
2011/11/29
0
0
Java深度历险 Java泛型

Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集...

SeanCai
2011/03/03
0
2
【翻译】C#编程语言和JAVA编程语言的比较(上)

【翻译】C#编程语言和JAVA编程语言的比较(上) 原文地址:http://www.25hoursaday.com/CsharpVsJava.html 简介 C#语言是一门面向对象的语言,开发者可以使用C#和微软.NET平台快速构建各种应...

fbf
2013/08/13
0
0
java 泛型-擦除erasure

类型擦除(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候...

110hxl
2014/02/11
0
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
06/21
0
0
一文搞懂Java泛型到底是什么东东

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述 泛型在j...

qq_39521554
04/17
0
0
Java编程语言高级特性入门学习——泛型、反射和注解!

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
06/02
0
0
泛型类、泛型方法及泛型应用-马洋

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

蓝神100
06/28
0
0
Kotlin泛型-你可能需要知道这些

本博文主要讲解一些Kotlin泛型的问题,中间会对比穿插Java泛型。 1. 泛型类型参数 1.1 形式 我们使用泛型的形式无非是类、借口、方法几种,我们先看两个例子。 1.2 声明泛型类 和Java一样,我...

24K男
04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、登录流程图 二、小程序客户端 doLogin:function(callback = () =>{}){let ...

公众号_好好学java
36分钟前
0
1
流利阅读笔记28-20180717待学习

“我不干了!” 英国脱欧大臣递交辞呈 雪梨 2018-07-17 1.今日导读 7 月 6 日,英国政府高官齐聚英国首相的官方乡间别墅——契克斯庄园,讨论起草了一份关于英国政府脱欧立场的白皮书。可是没...

aibinxiao
今天
6
0
OSChina 周二乱弹 —— 理解超算排名这个事,竟然超出了很多人的智商

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @-冰冰棒- :分享Ed Sheeran/Beyoncé的单曲《Perfect Duet (with Beyoncé)》 《Perfect Duet (with Beyoncé)》- Ed Sheeran/Beyoncé 手机...

小小编辑
今天
138
7
Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
今天
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
1
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部