四、  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. Eclipse中Maven运行项目时在Console中无日志出现的问题解决

    这是由于工作空间损坏造成的,比如重装JDK后,或者重装Maven后这些问题.解决方法如下: 1.删除现有工作空间,重新选择一个新的. 2.重置Workspece. 3.可能是Maven版本太新导致的, ...

  2. dubbo-admin安装和使用

    更新下链接,不知道是不是这个项目合入Apache的缘故,链接都变成了https://github.com/apache/incubator-dubbo/ 按照常理,直接去 https://github ...

  3. IPTABLES基本例子

    iptables –F #删除已经存在的规则 iptables -P INPUT DROP #配置默认的拒绝规则.基本规则是:先拒绝所有的服务,然后根据需要再添加新的规则. iptables -A I ...

  4. 【python】SHA1 算法

    http://blog.163.com/sh_wenfen/blog/static/99708242007231103936938/

  5. 【python】super()

    转自: http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html

  6. gnu-ucos 增加 bmp 位图显示

    昨天又下了点功夫弄了个在tft屏幕上显示bmp位图的. 我选择的是24位tft真彩測显示方式所以也要选择真彩色位图.网上给出的16位位图数组无法使用.在csdn上下载了2个制作工具,一个是c代码的,一 ...

  7. IDEA debug调式快捷键

    F9 resume programe 恢复程序 Alt+F10 show execution point 显示执行断点 F8 Step Over 相当于eclipse的f6 跳到下一步 F7 Step ...

  8. js来获取所有屏幕适配的总结

    "屏幕分辨率为:"+screen.width+"*"+screen.height "屏幕可用大小:"+screen.availWidth+& ...

  9. UWP开发入门系列笔记之(零):UWP的前世今生

    引言 在本篇文章中,可以掌握以下知识: 设备族群,如何决定目标设备 新的UI控件和新面板帮助你适应不同的设备特征 从Windows 8系统开始,微软就 引入了WindowsRT(Windows Run ...

  10. 并不对劲的p3709:大爷的字符串题

    题目大意 区间众数 题解 莫队 代码 #include<algorithm> #include<cmath> #include<cstdio> #include&l ...