zoukankan      html  css  js  c++  java
  • java泛型

    泛型

    泛型:类型作为实参传给类或方法。

    泛型声明:用一对尖括号<>声明。

    标识符可以是任意字母表示确定类型。常用 T(type) E(element) K(key) V(value)

    ?通配符表示不确定类型,只有在运行时才知道其类型。

    受限泛型:标识符受限泛型 和 ?通配符受限泛型

    标识符受限泛型:<? extends Number>  问号是Number的扩展类型。 <? super Number>  问号是Number的父类。

    ?通配符受限泛型:<T extends Number>问号是Number的扩展类型。  <T super Number> 问号是Number的父类。

    注释:Number子类有Integer、Double等。Number父类是Object。

     

     泛型标识符实例

    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 GenericsDemo01{
    public static void main(String args[]){
    Point<String> p = new Point<String>() ; // 里面的var类型为String类型
    p.setVar("it") ; // 设置字符串
    System.out.println(p.getVar().length()) ; // 取得字符串的长度
    }
    };

    ? 通配符实例

    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 GenericsDemo02{
    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 GenericsDemo03{
    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 GenericsDemo04{
    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 + "、") ;
    }
    };

    泛形常见问题

    使用泛形时,泛形类型须为引用类型,不能是基本数据类型

    ArrayList<String> list = new ArrayList<Object>();  //错

    ArrayList<Object> list = new ArrayList<String>(); //错

    ArrayList<String> list = new ArrayList ();               //行

    ArrayList list = new ArrayList<String>();               //行

    注:使用泛型

            *  两边的类型必须一致

                  ArrayList<String> list = new ArrayList<String>();

            *  两边只有一边用泛型(为了保持兼容性)

                  ArrayList<String> list = new ArrayList ();

                  ArrayList list = new ArrayList<String>();

  • 相关阅读:
    线段树 BZOJ1858 [Scoi2010]序列操作
    dfs序+线段树 BZOJ3252 攻略
    线段树 BZOJ3888 [Usaco2015 Jan]Stampede
    线段树 BZOJ1798 [Ahoi2009]Seq 维护序列seq
    大坑【持续更新……】
    LCA树剖法模板
    Tarjan-LCA HDU2586 How far away ?
    动态规划 洛谷P2401 不等数列
    搜索 洛谷P2530 [SHOI2001]化工厂装箱员
    动态规划 洛谷P1077 摆花
  • 原文地址:https://www.cnblogs.com/chenweichu/p/5651326.html
Copyright © 2011-2022 走看看