四、  Java Genericity

1.  Genericity 泛型

泛型 <T>
1. 泛型就是参数化类型
2. 作用:安全,方便
3. 适用于对多种数据类型执行相同功能的代码,主要适用于集合
4. 泛型中的类型在使用时指定,不能是基本数据类型5. 不能在静态方法和静态属性中使用所在类的泛型
6. 通常用单个大写字母表示,尽可能见名知意(T Type, K Key, V Value, E Element ...)7. 泛型嵌套:由外向内拆分

public class Genericity {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        // 安全
        list.add("So easy");// 编译时会进行类型检测
        // 方便
        String str = list.get(0);// 不需要强制转型

        // JDK 1.4 之前
        List list2 = new ArrayList();
        list2.add(1);
        list2.add("So");

        // 取出数据,麻烦,不安全
        Integer num = (Integer)list2.get(0);
        if(list2.get(1) instanceof String){
            String str2 = (String)list2.get(1);
        }
    }
}

// 泛型接口
public interface IGenericity<T> {
    public static final int MAX_VALUE = 1024;
    public abstract void method(T t) {};
    public abstract T method02(T t) {};
}

// 泛型类
public class Genericity<T> {    public T age;    public static T name;// 报错,不能在静态属性中使用所在类的泛型    public void method(T t) {}    public static void method02(T t) {}// 报错,不能在静态方法中使用所在类的泛型}

// 泛型方法,在返回类型、void 前使用 <字母>
public <T> void method() {}

2.  继承、实现泛型类

继承、实现泛型类
1. 父类为泛型类 | 泛型接口,子类继承 | 实现时:
 *   a.父类存在泛型,子类必须 >= *   b.父类擦除(即使用时 | 实现时 | 继承时没有指定类型)或指定类型,子类按需编写
 *   c.属性类型和方法根据所在位置而定:在父类中的,随父类而定;在子类中的,随子类而定

public abstract class Father<T1, T2> {
    T1 age;
    public abstract void test(T2 name);
}

// 父类存在泛型,子类必须 >=
// 1.擦除,没有指定具体类型。类似于 Object,但不等同于 Object,因为没有指定具体类型,在编译时不会进行类型检测;但如果指定为 Object,则在编译时会进行类型检测
public class Son extends Father/*<Object,Object>*/{
    @Override
    public void test(Object name) {}
}
// 2.全部保留
public class Son01<T1, T2> extends Father<T1, T2>{
    @Override
    public void test(T2 name) {}
}
// 3.部分保留
public class Son02<T2, A, B> extends Father<Integer, T2>{
    @Override
    public void test(T2 name) {}
}
// 4.不保留
public class Son03 extends Father<Integer, String>{
    @Override
    public void test(String name) {}
}

3.  ? 通配符

? 通配符
*  1.类型不确定
*  2.只用于声明变量 | 形参
*  3.不能用在创建对象、泛型类、泛型方法、泛型接口上

public class Wildcards {
    // 声明变量
    List<?> list = new ArrayList<>();
    list = new ArrayList<String>();
    list = new ArrayList<Integer>();

    // 声明形参
    public static void test(List<?> list){
    }

    // 编译错误,不能用在创建对象
    list = new ArrayList<?>();

    // 编译错误,不能用在创建泛型方法
    public static <?> void test(){}    

    // 编译错误,不能用在创建泛型类
    class Test<?>{}
}

4.  extends 泛型上限 & super 泛型下限

extends 泛型的上限  <=
 * 1.一般用于限制操作
 * 2.不能使用在添加数据上,一般是读取操作

super 泛型的下限  >=
 * 1.一般用于限制操作
 * 2.能够添加数据,不能添加父类对象 

public class Father {}
public class Son extends Father{}
public class Grandson extends Son{} 

public class Extends {
    public static void main(String[] args) {
        // 规则
        List<? extends Father> list = new ArrayList<Father>();
        test(list);
        List<Father> list2 = new ArrayList<Father>();
        test(list2);
        List<? extends Father> list3 = new ArrayList<Son>();
        test(list3);
        List<? extends Son> list4 = new ArrayList<GrandSon>();
        test(list4);

        List<?> list5 = new ArrayList<Son>();
        test(list5);// 编译错误,因为 <?> 等同于 <? extends Object>

    }

    // ? extends Father
    public static void test(List<? extends Father> list){
        /*
        不能用于添加数据!!!
        list.add(new Object());
        list.add(new Father());
        list.add(new Son());
        list.add(new Grandson());
        */
        list.add(null);
        System.out.println(list.get(0));
        }
}

public class Super {
    public static void main(String[] args) {
        //规则
        List<Son> list = new ArrayList<Son>();
        test(list);
        List<Father> list2 = new ArrayList<Father>();
        test(list2);
        List<Object> list3 = new ArrayList<Object>();
        test(list3);
        List<? super Son> list4 = new ArrayList<Son>();
        test(list4);
        List<? super Father> list5 = new ArrayList<Father>();
        test(list5);

        List<? super Grandson> list6 = new ArrayList<Son>();
        test(list6);// 编译错误,因为 <? super Grandson> 中存在不满足 <? super Son> 的情况
        List<?> list7 = new ArrayList<Object>();
        test(list7);// 编译错误,<?> 等同于 <? extends Object>  存在不满足 <? super Son> 的情况
    }

    // ? super Son
    public static void test(List<? super Son> list){
        // 不能添加父类对象  list.add(new Father()); list.add(new Object());
        list.add(new Son());
        list.add(new Grandson());
    }
}

Java Genericity的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. Java Class.cast方法

    1.Java api public T cast(Object obj); Casts an object to the class or interface represented 解释的比较笼统, ...

  3. Thinking in Java——笔记(15)

    Generics The term "generic" means "pertaining or appropriate to large groups of class ...

  4. Java Programming Language Enhancements

    引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...

  5. Java基础常见英语词汇

    Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的                             ['prəʊɡræmɪŋ]编程 OO: object ...

  6. java泛型编程

    一般的类和方法都是针对特定数据类型的,当写一个对多种数据类型都适用的类和方法时就需要使用泛型编程,java的泛型编程类似于C++中的模板,即一种参数化类型的编程方法,具体地说就是将和数据类型相关的信息 ...

  7. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  8. 专业英语词汇(Java)

    abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存取 ['.kses]‘(n.入口, ...

  9. Java基础学习-泛型概述和测试

    1.举例 首先先用集合来写个自定义对象存储并且去遍历. package genericity; import java.util.ArrayList; import java.util.Collect ...

随机推荐

  1. Java的循环结构

    以下内容引用自http://wiki.jikexueyuan.com/project/java/loop-control.html: 可能存在一种情况,当需要执行的代码块数次,通常被称为一个循环.Ja ...

  2. win7 休眠功能的开启与关闭

    1. 打开控制面板得下面目录,编辑计划设置

  3. ArcGIS Server 9.3集群部署(多som+多soc)

    关键字:集群 SOC 分布式 ArcGIS Server http://t.cn/8F8yPF3 http://t.cn/8F8yM4b http://www.netfoucs.com/nj19862 ...

  4. jquery在ajax新加入的元素后绑定事件click

    使用YII在做一个点击小图.能够在弹出窗体中显示大图的功能的时候,发现.GridView首页面的列表项按点击时一切正常,但按下了下一页后. 再点击小图,就不起作用了.原来,这是GridView使用了a ...

  5. VC++ VS2010 error LNK1123 转换到 COFF 期间失败 怎么办

    1 无法输出Hello world   2 点击项目-属性,打开属性页   3 配置属性-清单工具-输入和输出-嵌入清单改成否   4 找出计算机中的所有cvtres.exe,删掉早期的,只留最新版的 ...

  6. VC++ 2010编译错误 fatal error C1189 error This file requires _WIN32_WINNT to be #defined at least

    打开你的C++工程,找到里面的stdafx.h文件,然后把下面的红色内容替换成绿色的 参考:http://blog.csdn.net/dongliqiang2006/article/details/5 ...

  7. OUTPUT 子句

    除了修改数据以外,一般不会希望修改语句后再做其他事情.也就是说,一般不会希望修改语句能够返回任何输出.然而,在有些场合下,能够从修改过的行中返回数据,这个功能可能也有一定的用处. 例如,考虑UPDAT ...

  8. AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)

    首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...

  9. 【HRS项目】Axure兴许问题解决---与SVN结合

    上一篇博客介绍了Axure的团队开发用法,http://blog.csdn.net/u013036274/article/details/50999139,可是再用的时候发现会出现这种问题,例如以下图 ...

  10. struts2的文件上传机制

    Struts2的上传(基本流程例如以下) 1.Struts2默认採用了apache commons-fileupload 2.Struts2支持三种类型的上传组件 3.须要引入commons-file ...