四、  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. Tomcat错误信息(服务器版本号)泄露(低危)

    一.问题描述Tomcat报错页面泄漏Apache Tomcat/7.0.52相关版本号信息,是攻击者攻击的途径之一.因此实际当中建议去掉版本号信息. 二.解决办法 1.进入到tomcat/lib目录下 ...

  2. 【Nginx】http模块的数据结构

    定义fttp模块方式很简单,比如:ngx_module_t ngx_http_mytest_module; 其中,ngx_module_t是一个Nginx模块的数据结构. typedef struct ...

  3. Angular2.x-主/细节组件

    此刻,HeroesComponent显示heroes列表和所选heroes的详细信息. 随着应用程序的增长保持一个组件中的所有功能将不可维护.您需要将大型组件分成更小的子组件,每个组件都专注于特定的任 ...

  4. HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)

    HTTP协议漫谈   简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...

  5. 初探swift语言的学习笔记十一(performSelector)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  6. NoSQL之Redis探析

    下载地址:wget http://download.redis.io/releases/redis-2.8.8.tar.gz安装steps:1 下载Official Website : http:// ...

  7. [转] logback 常用配置详解(序)logback 简介

    转载文章:原文出处:http://aub.iteye.com/blog/1101222 logback 简介 Ceki Gülcü在Java日志领域世界知名.他创造了Log4J ,这个最早的Java日 ...

  8. Android 4.4.2 动态加入JNI库方法记录 (二 app应用层)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44458553 源代码下载地址:http://download.csdn ...

  9. iOS开发——高级篇——多线程GCD死锁

    面试题 请问以下代码打印结果: - (void)interview01 { // 以下代码是在主线程执行的 NSLog(@"执行任务1"); dispatch_queue_t qu ...

  10. Codeforces Beta Round #22 (Div. 2 Only) E. Scheme dfs贪心

    E. Scheme   To learn as soon as possible the latest news about their favourite fundamentally new ope ...