博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java泛型
阅读量:7024 次
发布时间:2019-06-28

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

hot3.png

虽然Scala创始人Martin Odersky说当年正是因为Java泛型的丑陋,所以才想到要创建一个新的语言,不过这仍然不妨碍我们学习Java泛型。毕竟即使听说Java泛型不好用,但好不好用还是得会用了才知道。下面是一些有关Java泛型的总结:

普通泛型

 
class Point< T>{  // 此处可以随便写标识符号,T是type的简称    private T var ; // var的类型由T指定,即:由外部指定    public T getVar(){ // 返回值的类型由外部决定     return var ;    }    public void setVar(T var){ // 设置的类型也由外部决定     this.var = var ;    }   };   public class GenericsDemo06{    public static void main(String args[]){     Point< String> p = new Point< String>() ; // 里面的var类型为String类型     p.setVar("it") ;  // 设置字符串     System.out.println(p.getVar().length()) ; // 取得字符串的长度    }   };  

----------------------------------------------------------

 
class Notepad< K,V>{  // 此处指定了两个泛型类型    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 GenericsDemo09{    public static void main(String args[]){     Notepad< String,Integer> t = null ;  // 定义两个泛型类型的对象     t = new Notepad< String,Integer>() ;  // 里面的key为String,value为Integer     t.setKey("汤姆") ;  // 设置第一个内容     t.setValue(20) ;   // 设置第二个内容     System.out.print("姓名;" + t.getKey()) ;  // 取得信息     System.out.print(",年龄;" + t.getValue()) ;  // 取得信息      }   };      

通配符

 
class Info< T>{    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 GenericsDemo14{    public static void main(String args[]){     Info< String> i = new Info< String>() ;  // 使用String为泛型类型     i.setVar("it") ;       // 设置内容     fun(i) ;    }    public static void fun(Info< ?> temp){  // 可以接收任意的泛型对象     System.out.println("内容:" + temp) ;    }   };     

受限泛型

 
class Info< T>{    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 GenericsDemo17{    public static void main(String args[]){     Info< Integer> i1 = new Info< Integer>() ;  // 声明Integer的泛型对象     Info< Float> i2 = new Info< Float>() ;   // 声明Float的泛型对象     i1.setVar(30) ;         // 设置整数,自动装箱     i2.setVar(30.1f) ;        // 设置小数,自动装箱     fun(i1) ;     fun(i2) ;    }    public static void fun(Info< ? extends Number> temp){ // 只能接收Number及其Number的子类     System.out.print(temp + "、") ;    }   };  

----------------------------------------------------------

 
  class Info< T>{    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 GenericsDemo21{    public static void main(String args[]){     Info< String> i1 = new Info< String>() ;  // 声明String的泛型对象     Info< Object> i2 = new Info< Object>() ;  // 声明Object的泛型对象     i1.setVar("hello") ;     i2.setVar(new Object()) ;     fun(i1) ;     fun(i2) ;    }    public static void fun(Info< ? super String> temp){ // 只能接收String或Object类型的泛型     System.out.print(temp + "、") ;    }   };     

Java泛型无法向上转型

 
class Info< T>{    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 GenericsDemo23{    public static void main(String args[]){     Info< String> i1 = new Info< String>() ;  // 泛型类型为String     Info< Object> i2 = null ;     i2 = i1 ;        //这句会出错 incompatible types    }   };     

Java泛型接口

 
interface Info< T>{  // 在接口上定义泛型    public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型   }   class InfoImpl< T> implements Info< T>{ // 定义泛型接口的子类    private T var ;    // 定义属性    public InfoImpl(T var){  // 通过构造方法设置属性内容     this.setVar(var) ;     }    public void setVar(T var){     this.var = var ;    }    public T getVar(){     return this.var ;    }   };   public class GenericsDemo24{    public static void main(String arsg[]){     Info< String> i = null;  // 声明接口对象     i = new InfoImpl< String>("汤姆") ; // 通过子类实例化对象     System.out.println("内容:" + i.getVar()) ;    }   };  

----------------------------------------------------------

 
  interface Info< T>{  // 在接口上定义泛型    public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型   }   class InfoImpl implements Info< String>{ // 定义泛型接口的子类    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 GenericsDemo25{    public static void main(String arsg[]){     Info i = null;  // 声明接口对象     i = new InfoImpl("汤姆") ; // 通过子类实例化对象     System.out.println("内容:" + i.getVar()) ;    }   };     

Java泛型方法

 
class Demo{    public < T> T fun(T t){   // 可以接收任意类型的数据     return t ;     // 直接把参数返回    }   };   public class GenericsDemo26{    public static void main(String args[]){     Demo d = new Demo() ; // 实例化Demo对象     String str = d.fun("汤姆") ; // 传递字符串     int i = d.fun(30) ;  // 传递数字,自动装箱     System.out.println(str) ; // 输出内容     System.out.println(i) ;  // 输出内容    }   };     

通过泛型方法返回泛型类型实例

 
class Info< T extends Number>{ // 指定上限,只能是数字类型    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 GenericsDemo27{    public static void main(String args[]){     Info< Integer> i = fun(30) ;     System.out.println(i.getVar()) ;    }    public static < T extends Number> Info< T> fun(T param){
//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定     Info< T> temp = new Info< T>() ;  // 根据传入的数据类型实例化Info     temp.setVar(param) ;  // 将传递的内容设置到Info对象的var属性之中     return temp ; // 返回实例化对象    }   };     

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

 
class Info< T>{ // 指定上限,只能是数字类型    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< String> i1 = new Info< String>() ;     Info< String> i2 = new Info< String>() ;     i1.setVar("HELLO") ;  // 设置内容     i2.setVar("汤姆") ;  // 设置内容     add(i1,i2) ;    }    public static < T> void add(Info< T> i1,Info< T> i2){     System.out.println(i1.getVar() + " " + i2.getVar()) ;    }   };     

Java泛型数组

 
public class GenericsDemo30{    public static void main(String args[]){     Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型数组     fun2(i) ;    }    public static < T> T[] fun1(T...arg){ // 接收可变参数     return arg ;   // 返回泛型数组    }    public static < T> void fun2(T param[]){ // 输出     System.out.print("接收泛型数组:") ;     for(T t:param){      System.out.print(t + "、") ;     }    }   };     

Java泛型的嵌套设置

 
class Info< T,V>{  // 接收两个泛型类型    private T var ;    private V value ;    public Info(T var,V value){     this.setVar(var) ;     this.setValue(value) ;    }    public void setVar(T var){     this.var = var ;    }    public void setValue(V value){     this.value = value ;    }    public T getVar(){     return this.var ;    }    public V getValue(){     return this.value ;    }   };   class Demo< S>{    private S info ;    public Demo(S info){     this.setInfo(info) ;    }    public void setInfo(S info){     this.info = info ;    }    public S getInfo(){     return this.info ;    }   };   public class GenericsDemo31{    public static void main(String args[]){     Demo< Info< String,Integer>> d = null ;  // 将Info作为Demo的泛型类型     Info< String,Integer> i = null ; // Info指定两个泛型类型     i = new Info< String,Integer>("汤姆",30) ;  // 实例化Info对象     d = new Demo< Info< String,Integer>>(i) ; // 在Demo类中设置Info类的对象     System.out.println("内容一:" + d.getInfo().getVar()) ;     System.out.println("内容二:" + d.getInfo().getValue()) ;    }   };  

转载于:https://my.oschina.net/lzwenme/blog/159851

你可能感兴趣的文章
[Android Pro] 创建快捷方式,删除快捷方式,查询是否存在快捷方式
查看>>
python基础之文件读写
查看>>
斐波那契递归的优化及指数计算的优化
查看>>
java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>()
查看>>
mysql 相关2
查看>>
使用包时,报 xxx.default is not a function
查看>>
Java单例模式
查看>>
大白话理解promise对象
查看>>
Oracle 物理结构(七) 文件-归档日志文件
查看>>
shell中的${},##和%%的使用
查看>>
【网络协议】ICMP协议、Ping、Traceroute
查看>>
今晚19:30直播阿里巴巴大规模持续集成的技术演进之路_欢迎免费观看
查看>>
最长公共子序列-golang
查看>>
FileReader:读取本地图片文件并显示
查看>>
ARC102D All Your Paths are Different Lengths
查看>>
spring的IO原理
查看>>
NSMuttableAttstring的用法
查看>>
android EditText控制最大输入行数
查看>>
Object—C 块在函数中作为参数时的分析
查看>>
leetcode Palindrome Number
查看>>