1. 程式人生 > >jdk 1.5新特性——泛型

jdk 1.5新特性——泛型

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

15,泛型

15.1泛型

泛型的符號:<泛型識別符號,泛型識別符號……>

泛型的作用:泛型就是用於接收具體引用資料型別的引數範圍。

泛型什麼時候用?

當操作的引用資料型別不確定的時候,就可以使用泛型。

使用泛型的好處:

1,將執行時期的問題轉到的編譯時期。

2,避免了強轉的麻煩。

泛型是JDK1.5的新特性,目的是增加安全性。

15.2泛型的擦除和補償

java原始檔中定義的泛型在執行時會被擦除,生成的位元組碼檔案是不帶泛型的,稱為泛型的擦除。

當在執行.class

位元組碼檔案時,會進行泛型的補償,目的是避免使用者強轉的動作。

泛型在集合、類、方法和介面中都有廣泛的應用。

15.3泛型類

當類中操作的引用資料型別不確定時,就可以使用泛型類

類上定義泛型的格式:

許可權飾符 class類名<泛型識別符號1,泛型識別符號2…….>{

…….CODE;

}

如:集合框架中的ArrayList<E>,定義了泛型,用來明確集合中要存放什麼型別的元素,集合物件建立時需要傳入具體的引用資料型別,一旦集合的泛型接收了具體的引用資料型別,那麼這個集合中只能儲存這一型別的元素,當傳入其它型別的元素,編譯器就會報錯。

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

      //新增元素

      al.add("abc1");

      al.add("abc2");

      al.add("abc2");

      al.add("abc1");

      al.add("abc4");

      al.add("abc5");

for(Iterator<String> it=al.iterator();it.hasNext();){

      String s=it.next();//如果不加泛型就需要強轉:String s=(String)it.next();

      System.out.println(s);

      }

如上,集合泛型為String型別,那麼集合中的元素,就必須是這一型別,否則編譯會報錯,提高了安全性。

在元素的取出過程中,因為next()取出的元素型別預設是Object型別,如果加了泛型就不需要再進行強轉的動作,否則必須要強轉,避免了強轉的麻煩。

如:以下自定義類中使用的泛型。

public class GenericDemo{

   public static void main(String[]args){

   Person<String,Integer> person=new Person<String,Integer>("lisi",23);//建立物件時指定具體泛型型別。

   Student<String,Integer> student=new student<String,Integer>("zhangsan",23,100);

      person.show();

      student.show();    

   }

}

class Person<N,A>{//Person類上定義了泛型

   private Aa;

   private Nn;

   Person(){

      

   }  

   Person(N n,A a){//構造引數使用了類上的泛型

      this.n=n;

      this.a=a;

   }  

   public void show(){

      System.out.println("姓名:"+this.n+" 年齡:"+this.a);

   }

}

class Student<N,A>extends Person<N,A>{//當子類繼承父類時,沒有傳入具體泛型型別時,子類也要定義泛型 

   private A a;

   private N n;

   private int s;

   Student(N n, A a, int s) {

      this.n=n;

      this.a=a;

      this.s = s;

   }

   public void show(){

      System.out.println("姓名:"+this.n+"年齡:"+this.a+"分數:"+this.s);

   }  

}

/*

 姓名:lisi 年齡:23

姓名:zhangsan年齡:23分數:100

 */

15.4泛型方法

如果一個類定義了泛型,那麼類中的方法可以使用類上的泛型作為引數。當然,如果方法中的引數型別不確定,則可以在方法上重新定義泛型。

注意:泛型在方法上的位置,只能定義在返回值的前面,修飾符的後面

格式:

許可權修飾符 成員修飾符 <泛型識別符號1,泛型識別符號2……>返回值型別 方法名稱(泛型識別符號1 變數,泛型識別符號2 變數,.....,其它引數{

            方法體;  

    }

如:

class Generic<T>{//定義了泛型的類

   private T  t;

   Generic(T t){

      this.t=t;

   }

   public void show_1(T t){//此方法的引數直接使用了類上的泛型,類上傳入什麼型別,這個方法的引數就是什麼型別。

   }

   public <A> void show_2(A a){//此方法的引數,沒有使用類上的泛型,而是使用了其他的泛型,則需要在方法上定義泛型。

   }

   public static <B> void show_3(B b){//注意,對於靜態方法的引數是不能直接訪問類上的泛型的,如果要使用泛型則需要在方法上重新定義泛型。

  }

}


注意:對於靜態方法是不能直接訪問類上的泛型的,因為類上的泛型是依賴物件的,而靜態方法不需要物件去呼叫,所以,靜態方法不能直接使用類上定義的泛型。如果靜態方法要使用泛型,則需要在靜態方法上定義泛型。

15.5泛型介面

格式:

interface介面名<泛型識別符號1,泛型識別符號2……>{

}

如:

interface Inter<T>{

   void show(T t);

}

注意:如果一個類實現了帶有泛型的介面時,如果沒有明確具體泛型型別,則這個類也必須要定義泛型。

如:

interface Inter<T>{

   void show(T t);

}

class Generic <T> implements Inter<T>{//沒有明確介面上泛型的具體型別,類也要定義泛型

 

   @Override

   public void show(T t) {

  }  

}

如果在實現一個泛型介面時,明確具體的泛型型別,就把具體的型別傳給介面上的泛型。這樣類上就需要再定義泛型。

如:

interface Inter<T>{

   void show(T t);

}

class Genericimplements Inter<String>{//明確介面上泛型的具體型別,直接傳入具體型別到介面上的泛型。

 

   @Override

   publicvoid show(String t) {

  }  

}

 

15.6泛型萬用字元

泛型萬用字元:?表示未知的泛型型別。

用字母作為泛型識別符號和泛型萬用字元?有什麼區別呢?

用字母作為泛型的識別符號,可以對其進行操作。

如:泛型方中,作為方法的返回值 ,作為一個型別,宣告一個變數,傳給類中的建構函式等等。

public <T> T show(T t){

//方法體;
}

而泛型萬用字元,代表未知的任意型別,是不能夠直接操作的,萬用字元多用於對泛型的限定。

泛型的限定分為:上限和下限

上限:<? extends具體引用型別A> ,表示可以接收A型別及其A的子類型別。

下限:<? super具體引用型別B>,表示可以收的B型別及B的父類型別。

上限和下限同樣可以用於對字母泛型識別符號的限定。

如:上限

public class GenericDemo{

   public static void main(String[]args){

      new Generic().show("abc"); //傳入字串型別,可以列印

      new Generic().show(123);//傳入其它型別,就報錯。

   }

}

class Generic{

   public <T extends String> void show(T t){//show(T t)方法的引數型別T必須是,String及其子類,不能傳入其它型別引數。

      System.out.println(t);

   }

}

如:下限

public class GenericDemo<T>{

   public static void main(String[]args){

      Person<String> p=new Person<String>("LISI",23);

      new Generic().show(p);

   }  

}

class Generic{

   public void show(Person<?super String> g){//此方法,用來接收Person型別 引數,對Person的泛型進行了下限。

      System.out.println(g.getT()+":"+g.getAge());

   }  

}

class Person<T>{

   private T t;

   private int age;

   public Person(T t,int age) {

      super();

      this.t = t;

      this.age = age;

   }

   

   public T getT() {

      return t;

   }

 

   public int getAge() {

     return age;

   }
}

15.7泛型在集合中的應用

泛型在集合中都有所應用,集合中使用泛型可以避免強轉。集合定義泛型,在建立集合物件時,可以明確具體的泛型型別,元素在取出時,就不需再進行強轉。

如:ArrayList集合

public class GenericDemo<T>{

   public static void main(String[]args){

      ArrayList al=newArrayList();//建立集合物件

      al.add("abc1");//add(Objectobj);方法中接收的引數都會被提升為Object型別。

      al.add("abc2");

      al.add("abc3");

      al.add("abc4");

      

      Iterator it=al.iterator();

      while(it.hasNext()){

         String s=(String)it.next();//新增的元素被提升為Object型別,取出時也是Object型別,要強轉。

         System.out.println(s);

      }

   }  

}

因為沒有加泛型,所以在元素取出時必須要強轉。

把泛型加入集合:

:

import java.util.ArrayList;

import java.util.Iterator;

 

public class GenericDemo<T>{

   public static void main(String[]args){

      ArrayList<String> al=new ArrayList<String>();//建立集合物件,並明確泛型型別

      al.add("abc1");//add(Objectobj);方法中接收的引數都會被提升為Object型別。

      al.add("abc2");

      al.add("abc3");

      al.add("abc4");

      

      Iterator <String>it=al.iterator();//元素的取出明確泛型

      while(it.hasNext()){

         String s=it.next();//新增的元素被是String,取出時也是String型別,不需要強轉。

         System.out.println(s);

      }

   }  

}

可見,泛型的應用,不僅可以對集合中元素的新增進行型別的限定,增強安全性,避免出錯,而且避免了元素在取出中強轉的麻煩。

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

相關推薦

jdk 1.5特性--

我們還是國際慣例,不廢話直奔主題。 網上的資料這樣定義泛型:Java的泛型就是建立一個用型別作為引數的類。感覺這個總結不夠全面。按我的理解,泛型相當於Java型別的佔位 符。 搞程式設計的人在概念上較真是幼稚的,概念意會就可以了。我們來看看使用泛型的好處: packa

jdk 1.5特性——

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 15,泛型 15.1泛型 泛型的符號:<泛型識別符號,泛型識別符號……> 泛型的作用:泛型就是

JDK 1.5 特性之列舉,舉例說明

對於比較穩定的值集合,Java 提供了列舉來定義,簡單舉例如下: package com.jalor; public class HomeWork { enum Weeks { MON() { @Override publ

JDK 1.5 特性-中文版

“JDK1.5”(開發代號猛虎)的一個重要主題就是通過新增一些特性來簡化開發,這些特性包括泛型,for-each 迴圈,自動裝包/拆包,列舉,可變引數, 靜態匯入 。使用這些特性有助於我們編寫更加清晰,精悍,安全的程式碼。  下面我們簡單介紹一下這些新特性。  1.泛型(Ge

jdk 1.5特性說明

JDK1.5”的一個重要主題就是通過新增一些特性來簡化開發,這些特性包括泛型,for-each 迴圈,自動裝包/拆包,列舉,可變引數, 靜態匯入 。使用這些特性有助於我們編寫更加清晰,精悍,安全的程式碼。 一. 首先簡單介紹一下各種特性及其使用 1.泛型(Generi

Java之JDK 1.5特性

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 下面簡略的說說jdk1.5的新特性。 泛型(Generics)--為集合(collections)提供編譯

jdk 1.5 特性 (ZZ)

JDK 1.5Java 5.0釋出了,許多人都將開始使用這個JDK版本的一些新增特性。從增強的for迴圈到諸如泛型(generic)之類更復雜的特性,都將很快出現在您所編寫的程式碼中。我們剛剛完成了一個基於Java 5.0的大型任務,而本文就是要介紹我們使用這些新特性的體驗。本文不是一篇入門性的文章,而是對這

JDK 1.5 特性

前言:為什麼會出現新特性呢?      新的技術的出現就是為了解決老的問題,Java語言隨著自身的不斷髮展,對那些不利於提高開發率的技術進行了改進。 1.靜態匯入   靜態匯入可以匯入靜態方法,這樣就不必寫類名而可以直接省略類名呼叫靜態方法了。   語法:import

Spring4特性依賴注入

什麼叫做泛型依賴注入呢? 就是帶泛型的兩個父類他們之間有引用關係, 子類各自繼承他們,子類之間彼此之間也會有父類間的引用關係。 舉例: 兩個父類:之間有引用關係。 package one;

JDK 1.7 特性之在數字字面量使用下劃線

轉自:https://blog.csdn.net/heartroll/article/details/78455045#%E5%9C%A8%E6%95%B0%E5%AD%97%E5%AD%97%E9%9D%A2%E9%87%8F%E4%BD%BF%E7%94%A8%E4%B8%8B%E5%88%92

16 API-集合(List的子類(ArrayList_Vector_LinkedList,集合巢狀遍歷),JDK5特性(,增強for迴圈,靜態匯入,可變引數)

1:List的子類(掌握) (1)List的子類特點ArrayList:底層資料結構是陣列,查詢快,增刪慢執行緒不安全,效率高Vector:底層資料結構是陣列,查詢快,增刪慢執行緒安全,效率低LinkedList:底層資料結構是連結串列,查詢慢,增刪快執行緒不安全,效率高

Kubernetes(k8s)1.5特性:Kubelet API增加認證和授權能力_Kubernetes中文社群

一、背景介紹 在Kubernetes1.5中,對於kubelet新增加了幾個同認證/授權相關的幾個啟動引數,分別是: 認證相關引數: •       anonymous-auth引數:是否啟用匿名訪問,可以選擇true或者false,預設是true,表示啟用匿名訪問。 •       auth

Kubernetes(k8s)1.5特性:支援windows容器_Kubernetes中文社群

一、Windows容器概述 1、Windows 容器型別 Windows 容器包括兩個不同的容器型別或執行時。 WindowsServer 容器 – 通過程序和名稱空間隔離技術提供應用程式隔離。 Windows Server 容器與容器主機和該主機上執行的所有容器共享核心。 Hyper-V容器

Java 1.5特性簡介

“JDK1.5”的一個重要主題就是通過新增一些特性來簡化開發,這些特性包括泛型,for-each 迴圈,自動裝包/拆包,列舉,可變引數, 靜態匯入 。使用這些特性有助於我們編寫更加清晰,精悍,安全的程式碼。 一. 首先簡單介紹一下

JDK 1.8特性Lambda入門

轉載至:https://blog.csdn.net/chenchaofuck1/article/details/51897481 網上關於java lambda的例子很多,但是這些五花八門的例子很不常見不常用,最後導致初學者望而卻步,其實我們抓住lambda的本質之後,會發現lambda還是

java特性

泛型genericity 泛型就是指類中的屬性的型別在例項化物件的時候通過外部進行了指定。 class 類名稱<泛型型別,泛型型別,…>{ } 一個泛型的小程式。 package org.study.RobertChao; public class Info

Open JDK 7 特性(即JDK 1.8 特性)

Summary Features are listed in order, more or less, from lowest to highest in the overall JDK  software stack. Features that were onc

JDK 1.8 特性之Stream 詳解個人筆記

雖然java 10已經發布,11 已經在路上,雖然 java EE 已經更名為 jakarta EE,但是大多數人連jdk1.8的新特性都不太瞭解,本人也是如此,所以在學習Java 8 API 新增的 Stream 的時候 做一些個人筆記,希望幫助自己的同時也能幫到大家。

JDK 1.8 特性之Lambda表示式

Lambda表示式基礎 Lambda表示式【Lambda Expressions】也可稱為閉包,是推動 Java 8 釋出的最重要新特性。Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),使用 Lambda 表示式可以使程式碼變的更加

1.5特性靜態匯入、增強for、可變引數、自動裝箱拆箱、列舉

第一  靜態匯入 一、概述: 1、import語句:是匯入一個類或某個包中的所有類。 2、import static語句:匯入一個類中的某個靜態方法或所有靜態方法。 3、特點:簡化了書寫,但是程式碼的閱讀性較差。 import static java.lang.M