我們知道在C++中模板可以很方便的代替任意類(lèi)型的數(shù)據(jù)。如下:

1. template<clas,江蘇會(huì)計(jì)證考試報(bào)名,2022年會(huì)計(jì)從業(yè)資格考試報(bào)名,2022年江蘇會(huì)計(jì)從業(yè)證報(bào)名,2022年江蘇會(huì)計(jì)從業(yè)考試報(bào)名,江蘇2022年會(huì)計(jì)從業(yè)資格考試成報(bào)名,2022年江蘇會(huì)計(jì)從業(yè)考試,會(huì)計(jì)電算化考試試題,2022年江蘇會(huì)計(jì)電算化,江蘇會(huì)計(jì)電算化試題,江蘇會(huì)計(jì)電算化考試,江蘇初級(jí)會(huì)計(jì)電算化,江蘇初級(jí)會(huì)計(jì)電算化考試">

射精一区欧美专区|国产精品66xx|亚洲视频一区导航|日韩欧美人妻精品中文|超碰婷婷xxnx|日韩无码综合激情|特级黄片一区二区|四虎日韩成人A√|久久精品内谢片|亚洲成a人无码电影

您現(xiàn)在的位置:首頁(yè) > IT認(rèn)證 > JAVA >

Java自定義的應(yīng)用技巧


我們?cè)贘AVA中處處都用到了范型,JAVA中的范型是從C++模板繼承來(lái)的,不過(guò)JAVA的范型的功能遠(yuǎn)遠(yuǎn)沒(méi)有C++那么強(qiáng)大。
   
    我們知道在C++中模板可以很方便的代替任意類(lèi)型的數(shù)據(jù)。如下:
   
    1. template<class T>
   
    2.
   
    3. void show(T x)
   
    4.
   
    5. {
   
    6.
   
    7. cout《x《endl ;
   
    8. }
   
    上面的T可以代表任意類(lèi)型的數(shù)據(jù),這樣不是大大減少了函數(shù)的重載次數(shù),提高了效率呢。Java是從C++過(guò)來(lái)的,理解了C++,java也不在話(huà)下。
   
    在Java中自定義范型也可以用在方法上。如下:
   
    1、
   
    //這樣聲明的范型可以代替任意類(lèi)型數(shù)據(jù),我們市場(chǎng)用到的鍵值對(duì)Map.Entry<K,V> 不就是給予范型的嗎?
   
    K V都可以代替任意類(lèi)型的值,但是在java中范型的實(shí)際類(lèi)型必須是引用類(lèi)型。
   
    1.   <K,V> void get(K k,V v)
   
    2.
   
    3.  {
   
    4.
   
    5.
   
    6.  }
   
    2、Java中的范型不能像C++那么靈活。
   
    1. <T>  T  add(T a,T b)
   
    2.
   
    3. {
   
    4.
   
    5.  //return  a+b   ;//很多人以為java也想C++一樣可以這樣 ,但是不可以 .
   
    6.
   
    7.  return  null;
   
    8.  }
   
    這個(gè)返回的null 也是有類(lèi)型限制的,比如上面的a b分別是Integer和String 那么就會(huì)取他們共同的基類(lèi)Object做為返回值類(lèi)型,其他的同理。
   
    3、實(shí)現(xiàn)任意類(lèi)型的數(shù)組的成員值的交換,注意在自定義范型中范型的實(shí)際類(lèi)型只能是引用數(shù)據(jù)類(lèi)型,不能是基本數(shù)據(jù)類(lèi)型。
   
    1.  public  static <T> void  swap(T[]a,int x,int y)
   
    2.  {
   
    3.  T  tem  =a[x]  ;
   
    4.  a[x]=a[y]  ;
   
    5.  a[y]=tem ;
   
    6.
   
    7.   }
   
    上面這個(gè)方法如果我swap(new Integer[]{1,2,3,4,5},1,2); //這樣就會(huì)自動(dòng)交換下標(biāo)1 2的值
   
    但是這樣調(diào)用就錯(cuò)了swao(new int[]{1,2,3,5,6},2,3) ; //所以說(shuō)Java的范型的實(shí)際類(lèi)型只能是引用數(shù)據(jù)類(lèi)型
   
    4、
   
    <T extends String> 表示類(lèi)型只能是String或者String的派生類(lèi)
   
    <T super String > 表示范型類(lèi)型只能是String或者String的父類(lèi)
   
    用法同上
   
    5、下面這個(gè)函數(shù)利用范型來(lái)實(shí)現(xiàn)類(lèi)型自動(dòng)轉(zhuǎn)換的功能。
   
    1. public static  <T> T autoConvert(Object obj)
   
    2. //因?yàn)榉祷刂凳?T標(biāo)識(shí)任意類(lèi)型 所喲可以 將返回結(jié)果賦值給任意類(lèi)型對(duì)象
   
    3.  {
   
    4.  return (T)obj;
   
    5.  }
   
    6.  Object  obj=="";
   
    7.
   
    8.  String str=autoConvert(obj);
   
    可以完成自動(dòng)轉(zhuǎn)換,因?yàn)榉缎蚑代表任意類(lèi)型,因此他可以賦值給String類(lèi)型的對(duì)象。
   
    6、將任意類(lèi)型的對(duì)象填充到任意類(lèi)型的數(shù)組中,與是fillArray(new Integer[]{2,3,4},"ddd"); 這樣調(diào)用是正確的,這樣做忽略類(lèi)型限制。
   
    1. public  static <T> void  fillArray(T[] a,T b)  //將任意一個(gè)對(duì)象填充到任意類(lèi)型的數(shù)組
   
    2.{
   
    3. for(int i =0;i<a.length;i++)
   
    4. {
   
    5. a[i] =b ;
   
    6. }
   
    7.}
   
    7、以自定義范型的形式顯示一個(gè)集合的數(shù)據(jù),下面一個(gè)是利用自定義范型一個(gè)是利用通配符來(lái)實(shí)現(xiàn),但是不同的是利用通配符操作的集合不能向集合中插入元素
   
    但是自定義范型卻可以。原因是通配符代表的集合我們不知道集合內(nèi)部具體元素 是什么類(lèi)型 所以 不能對(duì)集合進(jìn)行add操作。
   
    1. public static  <T> void showCollection(Collection<T> col,T  obj)  //利用范型來(lái)輸出任意類(lèi)型集合
   
    2. {
   
    3.  col.add(obj) ;
   
    4.  for(T a:col)
   
    5.  {
   
    6.  System.out.println(a);
   
    7.  }
   
    8.  }
   
    9.
   
    10.  public static void showCollection(Collection<?> col)  //利用范型來(lái)輸出任意類(lèi)型集合
   
    11. {
   
    12.  for(Object obj:col)
   
    13.  {
   
    14.  System.out.println(obj);
   
    15.  }
   
    16.  }
   
    8、如果一個(gè)類(lèi)中多個(gè)方法都需要范型,那么就是用類(lèi)級(jí)別的范型。
   
    例如:
   
    1. class  A<E>
   
    2.
   
    3. {
   
    4.
   
    5.  public void  add(E obj){}
   
    6.
   
    7.  public  E  get(){}
   
    8.
   
    9.  private E data;
   
    10. }
   
    這樣聲明范型和在函數(shù)前面聲明其實(shí)是一樣的,只不過(guò)是在類(lèi)的級(jí)別上作用于整個(gè)類(lèi)而已。
   
    9、 要注意范型只是給編譯器看的。
   
    也就是說(shuō)Vector<Integer> Vector<String> 他們用到的都是同一份字節(jié)碼,字節(jié)碼只有class文件加載到內(nèi)存中的時(shí)候才有。
   
    所以在一個(gè)類(lèi)中下面2個(gè)方法不能同時(shí)存在。
   
    void show(Vector<Integer>) {}
   
    void show(Vector<String>){}
   
    這兩個(gè)方法都不是重載,因?yàn)榫幾g后要去掉類(lèi)型信息。

相關(guān)文章

無(wú)相關(guān)信息
更新時(shí)間2022-09-16 10:00:15【至頂部↑】
聯(lián)系我們 | 郵件: | 客服熱線(xiàn)電話(huà):4008816886(QQ同號(hào)) | 

付款方式留言簿投訴中心網(wǎng)站糾錯(cuò)二維碼手機(jī)版

電話(huà):
付款方式   |   給我留言   |   我要糾錯(cuò)   |   聯(lián)系我們