文档章节

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

Clarence_D
 Clarence_D
发布于 2017/05/25 00:32
字数 1024
阅读 70
收藏 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
粉丝 9
博文 125
码字总数 100989
作品 0
天津
程序员
Java语言学习(十一):枚举类型和泛型

Java中一个重要的类型:枚举,它可以用来表示一组取值范围固定的变量,使用 enum 关键字定义枚举类型,其中元素不能重复,通常大写表示。利用Java的反射机制,可以在运行时分析类,如查看枚举...

海岸线的曙光
07/18
0
0
Java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

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

hensemlee
昨天
0
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基础再回首完美结束,感概万千!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52724939 JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千! 经过了几...

Aduroidpc
2016/10/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
4
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
158
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部