Java(C#)基礎差異-泛型

來源:互聯網
上載者:User

標籤:print   作用   區別   []   java   eric   對象   改變   pre   

1、限制泛型可用類型

Java

文法如下:

class 類名稱<T extends anyClass> 其中,anyClass指摸個介面或類。

使用泛型限制後,泛型類的類型必須實現或繼承了anyClass這個介面或類。無論anyClass是介面還是類,在進行泛型限制時都必須使用extends關鍵字。

舉例如下:

import java.util.*;public class LimitClass<T extends List> {    public static void main(String[] args) {        //可以執行個體化已經實現了List介面的類        LimitClass<ArrayList> l1=new  LimitClass<ArrayList>();        LimitClass<LinkedList> l2=new LimitClass<LinkedList>();        //下面這句是錯誤的,因為HashMap沒有實現List()介面        //LimitClass<HashMap> l3=new LimitClass<HashMap>();    }}

C#

where 關鍵字

2、使用類型萬用字元

Java

(1)在泛型機制中,提供了類型萬用字元,其主要作用是在建立一個泛型類對象時限制這個泛型類的類型實現或繼承某個介面或類的子類。要聲明這樣一個對象可以使用"?"萬用字元來表示,同時使用extends關鍵字來對泛型加以限制。

文法如下:

泛型類名稱<? extends List> a=null;

舉例如下:

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class WildcardClass<T> {    public static void main(String[] args) {        WildcardClass<? extends List> a = null;        a = new WildcardClass<ArrayList>();        a = new WildcardClass<LinkedList>();        // 下面這句是錯誤的,因為HashMap沒有實現List()介面        // a=new WildcardClass<HashMap>();    }}

(2)A<?>

使用A<?>這種形式執行個體化泛型類對象,則預設表示可以將A指定為執行個體化Object及以下的子類類型。

舉例如下:

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class WildcardClassTwo {    public static void main(String[] args) {        List<String> l1 = new ArrayList<String>();        l1.add("成員");        List<?> l2 = l1;        List<?> l3 = new LinkedList<Integer>();        System.out.println(l2.get(0));    }}

List<?>類型的對象可以接受String類型的ArrayList集合,也可以接受Integer類型的LinkedList集合。

那List<?> l2=l1語句與List l2=l1存在何種本質區別?

使用萬用字元聲明的名稱執行個體化的對象不能對其加入新的資訊,只能擷取或刪除。

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class WildcardClassTwo {    public static void main(String[] args) {        List<String> l1 = new ArrayList<String>();        l1.add("成員");        List<?> l2 = l1;        List<?> l3 = new LinkedList<Integer>();        System.out.println(l2.get(0));        l1.set(0, "成員改變");        // 使用萬用字元的對象調用set()方法,不能被調用        // l2.set(0, "成員改變");        // 可以使用l2的執行個體擷取集合中的值        l2.get(0);        // 根據鍵名刪除集合中的值        l2.remove(0);    }}

從執行個體可以看出,由於對象l1是沒有使用A<?>這種形式初始化出來的對象,所以它可以調用set()方法改變集合中的值,但l2則是通過使用萬用字元的方式建立出來的,所以不能改變集合中的值。

 

Code

JavaCode-->JavaVSNet/genericDemo

C#Code--> 

Java(C#)基礎差異-泛型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.