java学习笔记08--泛型

泛型可以解决数据类型的安全性问题,它主要的原理,是在类声明的时候通过一个标识标识类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化的时候只要指定好需要的类型即可。

  1. class Point<T>{
  2. private T var;     //var的类型由T决定 即由外包决定
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Point<String> p = new Point<String>();  //设置为String类型
  13. Point<Integer> p2 = new Point<Integer>();  //设置为Integer类型
  14. p.setVar("itmyhome");
  15. //p2.setVar("hello");  //p2设置为Integer类型  如果传入String类型就错误
  16. System.out.println(p.getVar());
  17. }
  18. }

构造方法中使用泛型

构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要像声明类那样指定泛型。

  1. class Point<T>{
  2. private T var;     //var的类型由T决定 即由外包决定
  3. public Point(T var){
  4. this.var = var;
  5. }
  6. public T getVar() {
  7. return var;
  8. }
  9. public void setVar(T var) {
  10. this.var = var;
  11. }
  12. }
  13. public class T {
  14. public static void main(String[] args) {
  15. Point<String> p = new Point<String>("itmyhome");  //设置为String类型
  16. System.out.println(p.getVar());
  17. }
  18. }

设置多个泛型

  1. class Point<K,V>{
  2. private K key;
  3. private V value;
  4. public K getKey() {
  5. return key;
  6. }
  7. public void setKey(K key) {
  8. this.key = key;
  9. }
  10. public V getValue() {
  11. return value;
  12. }
  13. public void setValue(V value) {
  14. this.value = value;
  15. }
  16. }
  17. public class T {
  18. public static void main(String[] args) {
  19. Point<String,Integer> p = new Point<String,Integer>();
  20. p.setKey("itmyhome");
  21. p.setValue(23);
  22. System.out.println(p.getKey());
  23. System.out.println(p.getValue());
  24. }
  25. }

泛型的安全警告

通配符

匹配任意类型的通配符

在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用传递的时候泛型类型必须匹配才可以传递,否则是无法传递的。

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<String> info = new Info<String>();   //设置泛型类型为String
  13. info.setVar("itmyhome");
  14. <span style="color:#ff0000;">fun(info);      </span>//此处无法传递类型不匹配
  15. }
  16. public static void fun(Info<Object> obj){  //接受Object泛型类型的info对象
  17. System.out.println(obj.getVar());
  18. }
  19. }

使用?通配符

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<String> info = new Info<String>();   //设置泛型类型为String
  13. info.setVar("itmyhome");
  14. fun(info);
  15. }
  16. public static void fun(Info<?> obj){  //接受?泛型类型的info对象
  17. //obj.setVar("change");  //使用?只能接受 不可以修改
  18. System.out.println(obj.getVar());
  19. }
  20. }

如果使用?意味着可以接受任意的内容,但是此内容却无法直接使用<?>修饰的泛型对象进行修改。

受限泛型

之前设置泛型类型的时候,实际上都是可以任意设置的,只要是类就可以设置,但是在java的泛型中可以指定一个泛型的上限和下限

在引用传递中,泛型操作中也可以设置一个泛型对象的范围上限和范围下限。范围上限使用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类,而范围下限使用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object类。

设置上限

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<Integer> info1 = new Info<Integer>();
  13. Info<Float> info2 = new Info<Float>();
  14. Info<String> info3 = new Info<String>();   //定义泛型类型为String
  15. info1.setVar(23);
  16. info2.setVar(50.0f);
  17. info3.setVar("itmyhome");
  18. fun(info1);
  19. fun(info2);
  20. fun(info3);     //泛型上限设置为Number 无法进行传递
  21. }
  22. public static void fun(Info<? extends Number> obj){  //只能接受Number及其Number的子类
  23. System.out.println(obj.getVar());
  24. }
  25. }

设置下限

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<String> info1 = new Info<String>();
  13. Info<Object> info2 = new Info<Object>();
  14. Info<Integer> info3 = new Info<Integer>();
  15. info1.setVar("itmyhome");
  16. info2.setVar("object");
  17. info3.setVar(23);
  18. fun(info1);
  19. fun(info2);
  20. fun(info3);   //泛型下限受限 ,无法进行传递
  21. }
  22. public static void fun(Info<? super String> obj){  //只能接受String和Object类型的泛型
  23. System.out.println(obj.getVar());
  24. }
  25. }

解释:泛型与子类继承的限制

一个类的子类可以通过对象的多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接受的,例如:Info<String>不能使用Info<Object>接受

泛型接口

之前的所有操作都是在类中直接使用泛型操作的,那么,对于java来说,也可以直接在接口中定义及使用泛型。

泛型接口实现的两种方式

定义子类,在子类的定义上也声明泛型类型

  1. interface Info<T>{            //在接口上定义泛型
  2. public T getVar();        //定义抽象方法 抽象方法的返回值就是泛型类型
  3. }
  4. class InfoImpl<T> implements Info<T>{    //定义泛型接口的子类
  5. private T var;
  6. public InfoImpl(T var){
  7. this.var = var;
  8. }
  9. public T getVar() {
  10. return var;
  11. }
  12. public void setVar(T var) {
  13. this.var = var;
  14. }
  15. }
  16. public class T {
  17. public static void main(String[] args) {
  18. Info<String> info = new InfoImpl<String>("itmyhome");
  19. System.out.println(info.getVar());
  20. }
  21. }

如果现在实现接口的子类不想使用泛型声明,则在实现接口的时候直接指定好操作的类型即可。

  1. interface Info<T>{            //在接口上定义泛型
  2. public T getVar();        //定义抽象方法 抽象方法的返回值就是泛型类型
  3. }
  4. class InfoImpl implements Info<String>{    //定义泛型接口的子类,直接指定类型
  5. private String var;
  6. public InfoImpl(String var){
  7. this.var = var;
  8. }
  9. public String getVar() {
  10. return var;
  11. }
  12. public void setVar(String var) {
  13. this.var = var;
  14. }
  15. }
  16. public class T {
  17. public static void main(String[] args) {
  18. Info info = new InfoImpl("itmyhome");
  19. System.out.println(info.getVar());
  20. }
  21. }

泛型方法

    1. class Demo{
    2. public<T> T fun(T var){
    3. return var;
    4. }
    5. }
    6. public class T {
    7. public static void main(String[] args) {
    8. Demo d1 = new Demo();
    9. Demo d2 = new Demo();
    10. System.out.println(d1.fun("itmyhome"));
    11. System.out.println(d2.fun(23));
    12. }
    13. }

java学习笔记08--泛型的更多相关文章

  1. 【原】Java学习笔记027 - 泛型

    package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...

  2. 【Java学习笔记】泛型

    泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...

  3. java学习笔记之泛型

    "泛型"这个术语的意思就是:"使用与许多许多的类型".泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力.如何做到这一点呢,正是通过解耦 ...

  4. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  5. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  6. java学习笔记10--枚举

    java学习笔记10--枚举 在JDK1.5之前,java可以有两种方式定义新类型:类和接口.对于大部分面向对 象编程来说,这两种方法看起来似乎足够了,但是在一些特殊情况下,这些方法就不适合.例如,想 ...

  7. JAVA自学笔记08

    JAVA自学笔记08 1.构造方法私有,外界就不能再创建对象 2.说明书的制作过程 1)写一个工具类,在同一文件夹下,测试类需要用到工具类,系统将自动编译工具类:工具类的成员方法一般是静态的,因此在测 ...

  8. java学习笔记10--泛型总结

    java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5-- ...

  9. 20145230《java学习笔记》第九周学习总结

    20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...

随机推荐

  1. 创建服务类PO

    转载:https://blogs.sap.com/2014/03/04/creating-a-simple-service-po-using-bapipocreate1bapipochange/ Cr ...

  2. Win7+花生壳6.0+tomcat打做自己的web服务器(搭建自己的网站)(参考)

    链接地址:http://blog.csdn.net/zhu_9527/article/details/23344623?utm_source=tuicool&utm_medium=referr ...

  3. 程序实践系列(七)C++概述

    理论练习题 C++语言与C语言的本质区别是什么? [參考答案]:C++与C语言的本质区别就在于C++是面向对象的.而C语言是面向过程的. 面向过程的程序设计方法与面向对象的程序设计方法在对待数据和函数 ...

  4. 菜单组件——axure线框图部件库介绍

    软件类的教程,我写不出长篇大论,这里面的都是基础的操作,希望初学者,根据一个功能演示,可以自己测试其他功能菜单的效果! Axure自带的菜单组件,我几乎没有用到过,做菜单导航,我第一时间想到的还是矩形 ...

  5. 最新OpenCV2.4.6与VS2010开发环境搭建

    OpenCV2.4.6与VS2010开发环境搭建 由于很久没有用OpenCV了,之前用的是1.0版本和VC++6.0.现在已经到了VS2010+OpenCV2.4.6.安装使用之后,发现OpenCV的 ...

  6. Paip.断点调试MYSQL存储过程跟函数的解决方案大法

    Paip.断点调试MYSQL存储过程跟函数的解决方案大法 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn ...

  7. spring AOP 是如何一步一步被简化的

    Aop的配置使用 Aop的思想实现是基于代理设计模式的, 动态增加某些功能. 因此在最开始阶段 1 所有需要被织入的类都需要被代理(ProxyFactoryBean). 2 切面(advisor)的实 ...

  8. Android用surface直接显示yuv数据(二)

    上一篇文章主要是參照AwesomePlayer直接用SoftwareRenderer类来显示yuv,为了能用到这个类,不惜依赖了libstagefright.libstagefright_color_ ...

  9. Android中ListView.getCount()与ListView.getChildCount()区别和OnScrollListener()各个参数的区别

    istView.getCount()(实际上是 AdapterView.getCount()) 返回的是其 Adapter.getCount() 返回的值.也就是“所包含的 Item 总个数”. Li ...

  10. Codeforces 484B Maximum Value(排序+二分)

    题目链接: http://codeforces.com/problemset/problem/484/B 题意: 求a[i]%a[j] (a[i]>a[j])的余数的最大值 分析: 要求余数的最 ...