泛型

泛型的引出

例:向下转型的错误示范

package Project.Study.Genericity;class Point{                    //定义坐标类private Object x;            //可以保存任意数据private Object y;         //可以保存任意数据public Object getX() {return x;}public Object getY() {return y;}public void setX(Object x) {this.x = x;}public void setY(Object y) {this.y = y;}
}
public class Test {public static void main(String args[]){Point p=new Point();             //实例化Point类数据p.setX("东经100度");                //设置坐标数据p.setY(10);                         //设置坐标数据System.out.println("x坐标:"+p.getX()+"y坐标"+p.getY());//根据设置好的坐标取出数据进行操作String x=(String)p.getX();          //取出坐标数据String y=(String)p.getY();         //取出坐标数据System.out.println("x坐标:"+x+"y坐标"+y);}
}
//结果
//Exception in thread "main" java.lang.ClassCastException: class //java.lang.Integer cannot be cast to class java.lang.String //(java.lang.Integer and java.lang.String are in module java.base of //loader 'bootstrap')
//  at Project.Study.Genericity.Test.main(Test.java:30)
//x坐标:东经100度y坐标10

例:使用泛型减少转型操作

package Project.Study.Genericity;
//此时的T在Point类定义上只表示一个标记,在使用时需要为其设置具体的类型
class Point<T>{       private T x;        //此属性的类型不知道,由Point类使用时的动态决定private T y;      //此属性的类型不知道,由Point类使用时的动态决定public T getX() {return x;}public T getY() {return y;}public void setX(T x) {this.x = x;}public void setY(T y) {this.y = y;}
}
public class Test {public static void main(String args[]){Point<String> p=new Point<String>();     //实例化Point类数据,设置泛型为Stringp.setX("东经100度");p.setY("北纬20度");System.out.println("x坐标:"+p.getX()+"y坐标"+p.getY());String x=p.getX();                           //取出坐标数据,不再需要强制类型转换String y=p.getY();                           取出坐标数据,不再需要强制类型转换System.out.println("x坐标:"+x+"y坐标"+y);}
}
//结果
//x坐标:东经100度y坐标10
//x坐标:东经100度y坐标10

提示:一个类中可以定义多个泛型标记。

class Point<P,R>{public R fun(P p){return null;}
}

需要注意的是,如果要想使用泛型,那么它能够采用的类型只能够是类,即不能是基本类型,只能是引用类型。

通配符

例:通配符"?"的使用

package Project.Study.Genericity;class Message<T>{private T msg;public void setMsg(T msg){this.msg=msg;}public T getMsg() {return msg;}
}
public class Test1 {public static void main(String args[]){Message<Integer>message1=new Message<>();Message<String>message2=new Message<>();message1.setMsg(30);message2.setMsg("Hello World");fun1(message1);                          //引用传递fun2(message2);}public static void fun1(Message<?> temp){   //不能设置,但是可以取出System.out.println(temp.getMsg());}public static void fun2(Message temp){       //默认使用Object作为泛型类型,可以在方法中随意修改对象内容(即使类型不符合),这种做法是不严谨的temp.setMsg(100);System.out.println(temp.getMsg());}
}
//结果
//30
//100

由上fun2(),必须使用通配符"?"来制约这种任意修改数据问题的操作。所以"?"设置的泛型类型只表示可以取出,但是不能设置,一旦设置了内容,程序编译就会出现错误提示。

“? extends 类”:设置泛型上限,可以在声明和方法参数上使用;

? extends Number:意味着可以设置Number或者是Number的子类(Integer、Double、…)

例:设置泛型的上限

package Project.Study.Genericity;class Message<T extends Number>{  //设置泛型上限,只能是Number或Number子类private T msg;public void setMsg(T msg){this.msg=msg;}public T getMsg() {return msg;}
}
public class Test1 {public static void main(String args[]){Message<Integer>message1=new Message<>();               //Integer是Number子类message1.setMsg(30);fun1(message1);                                           //引用传递}public static void fun1(Message<? extends Number> temp){   //定义泛型上限System.out.println(temp.getMsg());}
}
//结果
//30

“? super 类”:设置泛型下限,方法参数上使用;

? super String:意味着只能设置String或它的父类Object。

例:设置泛型的下限

package Project.Study.Genericity;class Message<T>{             //定义泛型private T msg;public void setMsg(T msg){this.msg=msg;}public T getMsg() {return msg;}
}
public class Test1 {public static void main(String args[]){Message<String>message1=new Message<>();message1.setMsg("Hello World");                       //设置属性内容fun1(message1);                                     //引用传递}public static void fun1(Message<? super String> temp){ //定义泛型下限System.out.println(temp.getMsg());}
}
//结果
//Hello World

泛型接口

任何情况下如果要使用接口,就必须定义相应的子类,而对于使用了泛型的接口子类而言,有以下两种实现方式。

实现方式一:在子类继续设置泛型标记

例:

package Project.Study.Genericity;interface IMessage<T>{      //定义泛型接口public void print(T t);
}
class MessageImpl<S>implements IMessage<S>{ //在子类继续设置泛型,此泛型也作为接口中的泛型类型public void print(S t){System.out.println(t);}
}
public class Test2 {public static void main(String[] args){IMessage<String>msg=new MessageImpl<String>();msg.print("HelloWorld");}
}
//结果
//HelloWorld

实现方式二:在子类不设置泛型,而为父类接口明确地定义一个泛型类型。

package Project.Study.Genericity;interface IMessage1<T>{public void print(T t);
}
class MessageImpl1 implements IMessage1<String>{public void print(String t){System.out.println(t);}
}
public class Test3 {public static void main(String [] args){IMessage1<String>msg=new MessageImpl1();msg.print("HelloWorld");}
}
//结果
//HelloWorld

泛型方法

package Project.Study.Genericity;public class Test4 {public static void main(String [] args){String str=fun("HelloWorld");System.out.println(str.length());}/*** 此方法为泛型方法,T的类型由传入的参数类型决定* 必须在方法返回值前明确定义泛型标记* @param t 参数类型,同时也决定了返回值类型* @param <T>* @return  直接返回设置进来的内容*/public static <T>T fun(T t){return t;}
}
//结果
//10

Java学习总结:21相关推荐

  1. java学习笔记21——JDBC

    文章目录 日报 11.11 JDBC 学习内容 JDBC JDBC 的核心 API DriverManager 类 Connection 接口 : Statement接口: PreparedState ...

  2. java学习日记21,IO流

    周二跑沙河开例会,晚上回来也在打王者,没怎么学习,就没记录了,今天继续坚持. File类 file,文件,java.IO.File类:文件和文件目录路径的抽象表示形式. File类可以对文件.文件夹进 ...

  3. Java学习笔记21

    Objects是Java 7新增的一个工具类,它提供了一些工具方法来操作对象,这些工具方法大多是"空指针"安全的. Objects实现的方法如下: requireNonNull(T ...

  4. Java 学习(21)--集合笔试题

    集合笔试题 1.产生10个1-20之间的随机数,要求随机数不能重复(List 和 Set 分别实现) 分析:1.创建一个 ArrayList 对象 2.如果 ArrayList 对象长度小于 10 3 ...

  5. [JAVA学习笔记] 21天学习挑战赛之流程控制语句

    ​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰.各位小伙伴,如果您: 想系统/深入学习某技术知识点- 一个人摸索学习很难坚持,想 ...

  6. java学习(21):移位运算符

    //移位运算符 public class test{ public static void main(String[] args){ int num=3; //向左移位 System.out.prin ...

  7. JAVA学习第21天; 聚合 aggregation

    条件查询CRUD 修改数据 update 表名 set 字段名='赋值' ,字段名2=''赋值2' 删除数据 delete from 表名 where 字段名='删除的数据' oirder by 排序 ...

  8. Java学习笔记22:并发(2)

    Java学习笔记22:并发(2) 图源:PHP中文网 终止任务 终止线程有一种非常简单的方式:设置一个多线程共享的标记位,子线程用轮询的方式检查这个标记位,如果该标记位显示取消状态,就让子线程退出执行 ...

  9. 2009 11月21日李兴华老师JAVA学习技术讲座

    为推动JAVA发展,让广大JAVA爱好者了解掌握JAVA/J2EE体系并确立学习方向,在周六特别为大家准备<JAVA开发者之路>技术讲座. 主讲介绍: 李兴华:MLDN魔乐科技 -- JA ...

  10. [Java]学习Java(1)运算符语句类

    [Java]学习Java(1)运算符&语句&类 一.运算符&语句 1.相等运算符"==" (1)基本类型时值相等就为true (2)对象比较时比较其引用地址 ...

最新文章

  1. jquery初始化的三种方式
  2. Android仿IOS的AssistiveTouch的控件EasyTouch实现
  3. React开发(109):引用错误 报错
  4. centos 7 菜鸟第一天 找回win10
  5. pytorch visdom蓝屏和无法启动
  6. sql ddl中key_SQL DDL:SQL Server中SQL DDL命令入门
  7. [转载] python2.7中模块学习- textwrap 文本包装和填充
  8. ThreadLocalConnection
  9. python操作本地数据库,Python基础篇-Python连接Mysql操作数据库
  10. 电脑qq音乐显示无法代理服务器,电脑QQ音乐软件无法登录如何解决
  11. 谈谈机器视觉的那点事儿!
  12. 写一本技术书到底有多赚?实话告诉你200万轻轻松松!
  13. MySql常见数据类型及五大约束
  14. Spring Boot实训开发个人博客9 - 标签管理
  15. 《哲学100问》读书感想:为什么要做一个道德的人
  16. GYM 101350 I. Mirrored String II
  17. LeetCode刷题遇到的小知识点总结
  18. 动态规划(DP)小结
  19. CAM350 V10.5/V14.6 导出拼板gerber文件
  20. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java陈氏商城9pd36

热门文章

  1. Unity导出apk出现的问题,JDK,Android SDK,NDK,无“安装模块”
  2. HDD工作原理 导图
  3. Springboot+mybatisplus搭建新闻管理系统
  4. 如何判断CPU、内存、磁盘的性能瓶颈?
  5. IFeature接口
  6. jquery 1.7.2源码解析(二)构造jquery对象
  7. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
  8. 通过正则表达式查找一个模式的所有实例
  9. 利益驱动 需求驱动 技术驱动 谁才是真正的驱动力?
  10. Python学习笔记二:布尔表达式