博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java泛型简介
阅读量:4291 次
发布时间:2019-05-27

本文共 7443 字,大约阅读时间需要 24 分钟。

一、类泛型

class Point
{ private T var; // var的类型由T指定,即:由外部指定 public T getVar() {//返回值由外部指定 return var; } public void setVar(T var) {//参数值由外部指定 this.var = var; }}public class TestController { public static void main(String[] args) throws Exception { //1 Point
p=new Point<>(); p.setVar("abc"); System.out.println(p.getVar()); //2 Point
p2=new Point<>(); p2.setVar(456); System.out.println(p2.getVar()); }}

两个参数的泛型

class Notepad
{ // 此处指定了两个泛型类型 private K key ; // 此变量的类型由外部决定 private V value ; // 此变量的类型由外部决定 public K getKey(){ return this.key ; } public V getValue(){ return this.value ; } public void setKey(K key){ this.key = key ; } public void setValue(V value){ this.value = value ; }}public class TestController { public static void main(String[] args) throws Exception { //Notepad
n1=new Notepad
();***可以简写为下面的形式 Notepad
n=new Notepad<>(); n.setKey(1); n.setValue("aaa"); System.out.println(n.getKey()+"----"+n.getValue()); }}

二、泛型 的类型限定

class Info
{//限定类型为Number及其子类}public class TestController { public static void main(String[] args) { Info
info1=new Info(); Info
info2=new Info(); Info
info3=new Info();//---->编译错误 }}

三、泛型 的实例限定 -----使用通配符“?”

表示通配整个泛型类

class Info
{ private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }}public class TestController { public static void main(String[] args) { //print1方法 接收String类型的泛型 Info
s1=new Info<>(); s1.setVar("byebye"); print1(s1); //接收Character类型的泛型 Info
s2=new Info<>(); s2.setVar('a'); print1(s2); } //接收任意类型(Object)的泛型对象 public static void print1(Info
temp) { System.out.println(temp.toString()); }}

四、通配符受限

extends

class Info
{ private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }}public class TestController { public static void main(String[] args) { Info
s1=new Info<>(); s1.setVar("byebye"); //print(s1); ----------->编译出错,print方法只能接收【类型为number子类】 的 Info类泛型对象 Info
s2=new Info<>(); s2.setVar(2); print(s2); } public static void print(Info
temp) { System.out.println(temp.toString()); }}

在第三部分中,可以看出,只有一个<?>实际上表示 <? extends Object>

super:

class Info
{ private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }}public class TestController { public static void main(String[] args) { Info
s1=new Info<>(); s1.setVar(1233); print(s1); Info
s2=new Info<>();//Number为Integer父类 s2.setVar(56787); print(s2); } //接收Integer或Integer父类 为类型 的Info类泛型对象 public static void print(Info
temp) { System.out.println(temp.toString()); }}

五、泛型对象的向上转型

class Info
{ private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; }}public class TestController { public static void main(String[] args) { Info
info1=new Info<>(); Info
info2=info1; //编译时出错 }}

六、泛型接口

表现形式1:实现类继承原泛型

interface Info
{ // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型}class InfoImpl
implements Info
{ // 定义泛型接口的子类 private T var ; public InfoImpl(T var){ this.setVar(var) ; } public void setVar(T var){ this.var = var ; } @Override public T getVar(){ return this.var ; }};public class TestController { public static void main(String[] args) { InfoImpl
info=new InfoImpl<>("qwer"); System.out.println(info.getVar()); }}

表现形式2:实现类继承固定类型的泛型接口

实现类不是泛型类

interface Info
{ // 在接口上定义泛型 public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型}class InfoImpl implements Info
{ // 定义泛型接口的子类 private String var ; // 定义属性 public InfoImpl(String var){ // 通过构造方法设置属性内容 this.setVar(var) ; } public void setVar(String var){ this.var = var ; } public String getVar(){ return this.var ; }};public class TestController { public static void main(String[] args) { InfoImpl info=new InfoImpl("qwer"); System.out.println(info.getVar()); }}

七、泛型方法

class Demo1 {    public String fun(String s) {        return s;    }    public int fun(int i) {        return i;    }}class Demo2 {    public 
T fun(T t) { // 可以接收任意类型的数据 return t; // 直接把参数返回 }}public class TestController { public static void main(String[] args) { //不用泛型方法,使用重载 Demo1 demo1=new Demo1(); System.out.println(demo1.fun("我是demo1"));//---->第一个方法 System.out.println(demo1.fun(1));//---->第二个方法 //使用泛型方法,免去了重载多个方法的麻烦 Demo2 demo2=new Demo2(); System.out.println(demo2.fun("我是demo2,我只有一个方法")); System.out.println(demo2.fun(22222)); }}

八、通过 泛型方法 返回 其他泛型类型 的

class Info
{ // 指定上限,只能是数字类型 private T var ; // 此类型由外部决定 public T getVar(){ return this.var ; } public void setVar(T var){ this.var = var ; } public String toString(){ // 覆写Object类中的toString()方法 return this.var.toString() ; } }; public class GenericsDemo28{ public static void main(String args[]){ Info
i1 = new Info
() ; Info
i2 = new Info
() ; i1.setVar("HELLO") ; // 设置内容 i2.setVar("汤姆") ; // 设置内容 add(i1,i2) ; } public static
void add(Info
i1,Info
i2){ System.out.println(i1.getVar() + " " + i2.getVar()) ; } };

九、使用泛型统一传入的参数类型

class Info
{ private T var ; // 此类型由外部决定 public T getVar(){ return this.var ; } public void setVar(T var){ this.var = var ; } public String toString(){ // 覆写Object类中的toString()方法 return this.var.toString() ; } }; public class GenericsDemo28{ public static void main(String args[]){ Info
i1 = new Info
() ; Info
i2 = new Info
() ; i1.setVar("HELLO") ; // 设置内容 i2.setVar("汤姆") ; // 设置内容 add(i1,i2) ; } public static
void add(Info
i1,Info
i2){ System.out.println(i1.getVar() + " " + i2.getVar()) ; } }

转载地址:http://mnhgi.baihongyu.com/

你可能感兴趣的文章
Session做一个小例子(java web)
查看>>
实现java多线程的3种方式,99%人没用过第3种
查看>>
解析oracle的rownum
查看>>
Redis主从复制和集群配置
查看>>
深入理解Eureka
查看>>
Linux下Apache的安装与配置
查看>>
Redis简介,安装和配置,停止,卸载(图解方式)
查看>>
多线程之线程的百米赛跑
查看>>
你可能不知道的js
查看>>
Java Web笔记
查看>>
架构师之路--视频业务介绍,离线服务架构和各种集群原理(1/2)
查看>>
一台nginx服务器多域名配置
查看>>
关于java web项目使用log4j / 当装了两个tomcat后,如何修改tomcat端口
查看>>
大数据和高并发的解决方案汇总
查看>>
Mysql索引会失效的几种情况分析
查看>>
使用redis实现消息发布订阅
查看>>
数据库性能优化的五种方案(mycat,基于阿里coba开源的数据库中间件,很容易实现分库分表、主从切换功能。另一个当当网开源的一个库 sharding-jdbc)
查看>>
Java NIO详解
查看>>
Mycat分库分表的简单实践 / 用Mycat,学会数据库读写分离、分表分库
查看>>
MySQL索引实战汇总
查看>>