java泛型使用,泛型 JAVA

本文目錄一覽:

Java中怎樣使用泛型T類的方法

 調用泛型方法語法格式如下

泛型方法

是否擁有泛型方法,與其所在的類是否泛型沒有關係。要定義泛型方法,只需將泛型參數列表置於返回值前。如:

public class ExampleA {

public T void f(T x) {

System.out.println(x.getClass().getName());

}

public static void main(String[] args) {

ExampleA ea = new ExampleA();

ea.f(” “);

ea.f(10);

ea.f(‘a’);

ea.f(ea);

}

}

輸出結果:

java.lang.String

java.lang.Integer

java.lang.Character

ExampleA

使用泛型方法時,不必指明參數類型,編譯器會自己找出具體的類型。泛型方法除了定義不同,調用就像普通方法一樣。

需要注意,一個static方法,無法訪問泛型類的類型參數,所以,若要static方法需要使用泛型能力,必須使其成為泛型方法。

簡述java常用3種泛型定義及其作用

泛型(Generic type 或者 generics)是對 Java 語言的類型系統的一種擴展,以支持創建可以按類型進行參數化的類。可以把類型參數看作是使用參數化類型時指定的類型的一個佔位符,就像方法的形式參數是運行時傳遞的值的佔位符一樣。

定義泛型方法語法格式如下:

定義泛型方法時,必須在返回值前邊加一個T,來聲明這是一個泛型方法,持有一個泛型T,然後才可以用泛型T作為方法的返回值。

ClassT的作用就是指明泛型的具體類型,而ClassT類型的變數c,可以用來創建泛型類的對象。

java中的泛型 求詳細解釋

1、Java泛型

其實Java的泛型就是創建一個用類型作為參數的類。就象我們寫類的方法一樣,方法是這樣的method(String str1,String str2 ),方法中參數str1、str2的值是可變的。而泛型也是一樣的,這樣寫class Java_Generics<K,V>,這裡邊的K和V就象方法中的參數str1和str2,也是可變。下面看看例子:

//code list 1

import Java.util.Hashtable;

class TestGen0<K,V>{

 public Hashtable<K,V> h=new Hashtable<K,V>();

 public void put(K k, V v) {

h.put(k,v);

 }

 public V get(K k) {

return h.get(k);

 }

 public static void main(String args[]){

TestGen0<String,String> t=new TestGen0<String,String>();

t.put(“key”, “value”);

String s=t.get(“key”);

System.out.println(s);

 }

}

正確輸出:value

這只是個例子(Java中集合框架都泛型化了,這裡費了2遍事.),不過看看是不是創建一個用類型作為參數的類,參數是K,V,傳入的「值」是String類型。這個類他沒有特定的待處理型別,以前我們定義好了一個類,在輸入輸入參數有所固定,是什麼型別的有要求,但是現在編寫程序,完全可以不制定參數的類型,具體用的時候來確定,增加了程序的通用性,像是一個模板。

呵呵,類似C++的模板(類似)。

1.1. 泛型通配符

下面我們先看看這些程序:

//Code list 2

void TestGen0Medthod1(List l) {

 for (Object o : l)

System.out.println(o);

}

看看這個方法有沒有異議,這個方法會通過編譯的,假如你傳入String,就是這樣List<String>。

接著我們調用它,問題就出現了,我們將一個List<String>當作List傳給了方法,JVM會給我們一個警告,說這個破壞了類型安全,因為從List中返回的都是Object類型的,而讓我們再看看下面的方法。

//Code list 3

void TestGen0Medthod1(List<String> l) {

 for (Object o : l)

System.out.println(o);

}

因為這裡的List<String>不是List<Object>的子類,不是String與Object的關係,就是說List<String>不隸屬於list<Object>,他們不是繼承關係,所以是不行的,這裡的extends是表示限制的。

類型通配符是很神奇的,List<?>這個你能為他做什麼呢?怎麼都是「?」,它似乎不確定,他總不能返回一個?作為類型的數據吧,是啊他是不會返回一個「?」來問程序員的?JVM會做簡單的思考的,看看代碼吧,更直觀些。

//code list 4

List<String> l1 = new ArrayList<String>();

li.add(「String」);

List<?> l2 = l1;

System.out.println(l1.get(0));

這段代碼沒問題的,l1.get(0)將返回一個Object。

1.2. 編寫泛型類要注意:

1) 在定義一個泛型類的時候,在 「<>」之間定義形式類型參數,例如:「class TestGen<K,V>」,其中「K」 , 「V」不代表值,而是表示類型。

2) 實例化泛型對象的時候,一定要在類名後面指定類型參數的值(類型),一共要有兩次書寫。例如:

TestGen<String,String> t=new TestGen<String,String>();

3) 泛型中<K extends Object>,extends並不代表繼承,它是類型範圍限制。

2、泛型與數據類型轉換

2.1. 消除類型轉換

上面的例子大家看到什麼了,數據類型轉換的代碼不見了。在以前我們經常要書寫以下代碼,如:

//code list 5

import Java.util.Hashtable;

class Test {

 public static void main(String[] args) {

Hashtable h = new Hashtable();

h.put(“key”, “value”);

String s = (String)h.get(“key”);

System.out.println(s);

 }

}

這個我們做了類型轉換,是不是感覺很煩的,並且強制類型轉換會帶來潛在的危險,系統可能會拋一個ClassCastException異常信息。在JDK5.0中我們完全可以這麼做,如:

//code list 6

import Java.util.Hashtable;

class Test {

 public static void main(String[] args) {

Hashtable<String,Integer> h = new Hashtable<String,Integer> ();

h.put(“key”, new Integer(123));

int s = h.get(“key”).intValue();

System.out.println(s);

 }

}

這裡我們使用泛化版本的HashMap,這樣就不用我們來編寫類型轉換的代碼了,類型轉換的過程交給編譯器來處理,是不是很方便,而且很安全。上面是String映射到String,也可以將Integer映射為String,只要寫成HashTable<Integer,String> h=new HashTable<Integer,String>();h.get(new Integer(0))返回value。果然很方便。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/237494.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:05
下一篇 2024-12-12 12:05

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論