关闭

java高级特性之泛型

117人阅读 评论(2) 收藏 举报
分类:

看了一些关于泛型的文章,写一下自己对于泛型的理解。。
当我们知道了泛型可以用来干什么之后就自然而然会明白泛型是什么了,即使它是一个非常抽象的东西。
泛型,泛,大致的,就是你知道它是一个黑盒子里面装的东西,但是你不知道它具体是什么,它可能是炸弹,可能是糖果,或者是iphone X。
那泛型可以用来干什么呢,打个比方,老板让你送一个快递盒子,你的快递盒子里面装的东西你并不知道,老板也不会告诉你它是什么(如果每次都告诉你是什么东西岂不是非常麻烦?),但是老板告诉你,你要非常小心,不能剧烈抖动(实际上老板已经告诉你它有一个特点,就是易碎或者是在剧烈抖动下易损坏),你要做的事情就是将你的快递盒子交给老板要求送到的一个人。
那整理一下思路,我们需要的东西是:盒子(未知对象)、送给谁、剧烈抖动下易损坏。
用程序表示:

Test.java
public class Test {

    public static <T> T hezitoWho(man me,T t,man who) {
        System.out.println("运送目标:"+who.getName());
        if(t.getClass()==hezi.class) {
        hezi hezi = (hezi)t;
        if(hezi.isFragile()) {
            me.beCareful();
        }
        else {
            me.dontWorry();
        }
        }
        return t;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        man me = new man("我");
        man who = new man("周星星");
        hezi hezi = new hezi();
        String stringhezi = new String("stringhezi");
        Integer integerhezi = new Integer(0);
        who.get(hezitoWho(me,hezi,who));
        who.get(hezitoWho(me,stringhezi,who));
        who.get(hezitoWho(me,integerhezi,who));
    }

}
man.java
public class man {
    private String name;

    public man(String name) {
        this.name = name;
    }
    public void beCareful(){
        System.out.println(name+"小心运送中..");
    }

    public void dontWorry(){
        System.out.println(name+"不用小心,大胆动起来,运送中..");
    }

    public <T> void get(T t) {
        if (t!=null)
        System.out.println(name+"收到"+t.toString());
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
hezi.java
public class hezi{
    private boolean fragile=true;//盒子是易碎的

    public boolean isFragile() {
        return fragile;
    }

    public void setFragile(boolean fragile) {
        this.fragile = fragile;
    }

    public String toString() {
        return hezi.class.toString();
    }
}

这个例子比较繁琐。。帮助我个人理解。。。
这个时候我们会发现,可以直接使用Object作为类似泛型来操作这样的例子,比如例子中的hezi,直接在函数中把它当作对象进行处理,最后根据情况进行不同对象的强转即可。
但是强转很容易出现ClassCastException,因为我们在处理不同对象时要进行分辨然后分别进行转化,如:
If(class==“String”){//转化成String}
If (class==”Integer”){//转化成Integer}

当数据类型较多时,就会出现非常多复杂冗余的代码,所以,为了提高我们程序的灵活性和拓展性,我们还是应该学会灵活应用泛型。

泛型的使用:
1. 具有一个或多个类型的变量的类,叫做泛型类
class A {
}

  1. 在创建泛型类实例时,需要为其类型变量赋值
    A a = new A();

    • 如果创建实例时,不给类型变量赋值,那么会有一个警告!(目的是向下兼容)
  2. 具有一个或多个类型的方法,叫做泛型方法
    class A {
    public T fun(T t) {}//不是泛型方法
    public void fun(){}
    public void fun(T t){}
    public T fun(T t){}
    }

  3. 泛型在类中或方法中的使用
    class A {
    private T bean;//成员变量
    public T fun(T t) {}//类中的方法上(返回值和参数类型)

    public void fun2() {
    T b = … //泛型还可以在局部变量的引用类型上使用
    new T();//不行
    }
    }

  4. 泛型的继承 class AA extends A{}//不行(子类不是泛型,不能继承父类的泛型)

  5. 通配符
    内容比较复杂,总结少部分。
List<Animal>
List<Cat>
List<? extends Animal>
类似
List<? super Cat> 
(List容器中装的类型应当一致,如全部为Animal对象,所以一般含?的List不能add不同类型的对象)
0
0
查看评论

java高级特性之泛型

泛型擦除反射机制自定义泛型类自定义类型方法java泛类型相关知识1 为什么使用泛型解决元素存储时候的安全性问题,同时解决获取集合元素的时候类型强转的问题。提高代码的重用率。例如编写一个泛型类,而我们不去关心类的具体类型,而用T来代表其变化的类型。T不能代表基本数据类型。泛型注意:在使用泛型的表达式中...
  • xiaozhaorui
  • xiaozhaorui
  • 2016-07-18 21:14
  • 697

java高级特性之--集合

集合框架 所谓集合框架就是一个类库的集合,集合框架就是用来表示和操作集合的统一架构,它包含了实现集合的接口与类 集合框架中不同集合类各自有不同的数据结构,所以在使用中要根据应用的性能要求来选择不同的集合类。 集合类存放在java.util包中,今后进行程序编写时将大量使用集合类和相关接口。 Iter...
  • djx5344
  • djx5344
  • 2017-08-01 09:15
  • 94

JAVA高级特性之集合

框架 http://www.cnblogs.com/skywang12345/p/3308498.html List集合 http://www.cnblogs.com/skywang12345/p/3308513.html http://www.cnblogs.com/skywang1234...
  • ChuanSuoYiDaSan
  • ChuanSuoYiDaSan
  • 2018-01-08 14:27
  • 30

java高级特性之集合概述

java中的集合概述map 接口总结java集合学习1 java中存储数据的方式 1 数组 (基本数据类型+引用数据类型)。2 集合(对象)数组存储数据的缺点1:数组一旦创建,长度固定 2:数组不能直接确定有效元素的个数java中的集合概述:java集合接口:Collection 接口 和Map 接...
  • xiaozhaorui
  • xiaozhaorui
  • 2016-07-17 08:51
  • 1708

java高级特性之--泛型

泛型类public class GenClass<T>{ private T obj; public GenClass(T obj){ this.obj = obj; } public T getObj(){ return ...
  • djx5344
  • djx5344
  • 2017-07-31 18:50
  • 61

Java高级特性之泛型

首先我们先提出两个问题: 什么是泛型? 为什么要使用泛型? 我们先来看看第一个问题什么是泛型。如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了。多态性表示一个对象具备多种状态。比如说你自己,你首先是一个人,同时你在看这篇帖子说明你是一个程序员,下了班之后你可能有变成了禽兽。...
  • soul_code
  • soul_code
  • 2015-12-31 16:48
  • 2407

深入理解Java虚拟机:JVM高级特性与最佳实践

目 录 [ - ] 《深入理解Java虚拟机:JVM高级特性与最佳实践》前言《深入理解Java虚拟机:JVM高级特性与最佳实践》内容特色《深入理解Java虚拟机:JVM高级特性与最佳实践》目录第1章 走近Java1.1 概述1.2 Java技术体系1.3 Java发展史1.4 展望J...
  • ityouknow
  • ityouknow
  • 2016-06-24 10:18
  • 3137

java高级特性

第六天: 教学任务:         第六章  高级特性, 共 39 个slide(132-171); 目标: -----------------------------------------...
  • jakeswang
  • jakeswang
  • 2016-01-25 11:10
  • 515

【学习总结】java高级特性之四种JAVA内部类总结

标题:java内部类 内部类:在JAVA中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、静态内部类、局部内部类、匿名内部类。 —————————————————————————————————————— 1.成员内部类: ...
  • heccmm
  • heccmm
  • 2016-12-20 18:13
  • 383

一步步学spark之一scala高级特性中泛型类与泛型函数3.6

一步步学spark之一scala高级特性中泛型类 泛型类中的泛型是包容具体类型变换的,对这些具体不同的类型,泛型类根据类型进行统一的操作,很多时候泛型类就相当于模板。 泛型定义一个泛型参数 两个泛型参数 定义空的Map 返回的类型中是Nothing map中也是泛型 ...
  • u014793522
  • u014793522
  • 2016-05-26 14:58
  • 987
    个人资料
    • 访问:1151次
    • 积分:102
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论