1. java中的泛型和C++中的模板是不是一樣啊,哪位大俠知道,請舉例說明下,多謝。
很不一樣,隨便列舉一些
c++的模板,就如同模板這個詞字面上的意思一樣,屬於字元的替代過程
比如有一個模板函數
template <typename T>
void foo(T t) {
t.bar();
}
那麼這個可以編譯。不過你使用這個函數的時候,T必須是包含bar函數的類
java 則不行
static <T> void foo(T t) {
t.bar();
}
這個是通不過編譯的,因為編譯器只知道T是一種Object,不知道T的具體類型。
你甚至不能寫T t = new T(); 因為在這個方法定義的時候,編譯器也不能保證T是有構造函數的
因為c++的模板做事方式是字元串的替代,所以模板參數是int等基本類型是完全沒有問題的。
java則不允許int等基本類型作為泛型參數。比如ArrayList<int>是不可以的
java 有covariance 和 contravariance
也就是也可以寫一個泛型方法,限定泛型參數是某一個具體的類的子類,比如
static <T> void foo(List<T extends Object> list)
這將能夠接受List<String>作為參數,如果只寫List<Object>,那是不能將List<String>作為參數傳給他的
c++沒有這種機制
2. c#泛型和java泛型的區別
泛型技術在C#和Java之中的使用方式看似相同,但實現上卻有著根本性的分歧,內C#裡面泛型無論在程序容源碼中、編譯後的IL中(Intermediate Language,中間語言,這時候泛型是一個佔位符)或是運行期的CLR中都是切實存在的,List<int>與List<String>就是兩個不同的類型,它們在系統運行期生成,有自己的虛方法表和類型數據,這種實現稱為類型膨脹,基於這種方法實現的泛型被稱為真實泛型。
Java語言中的泛型則不一樣,它只在程序源碼中存在,在編譯後的位元組碼文件中,就已經被替換為原來的原始類型(Raw Type,也稱為裸類型)了,並且在相應的地方插入了強制轉型代碼,因此對於運行期的Java語言來說,ArrayList<int>與ArrayList<String>就是同一個類。所以說泛型技術實際上是Java語言的一顆語法糖,Java語言中的泛型實現方法稱為類型擦除,基於這種方法實現的泛型被稱為偽泛型。
3. java中什麼叫泛型
泛就是廣泛,泛指,型是數據類型. 在java中為了方便多種數據通用一個結構而引入了這個概念.
比如 class A<E> {}, 那麼E就是一個泛型,它可以替換為任意類型.
class A<E> { E obj; }
在使用時, A<String>相當於定義了class A {String obj;}. A<Integer>相當於定義了class A{Integer obj;}
使用比如A<String> astr = new A<String>(); 那麼astr.obj就是一個String
4. JAVA中的泛型用法一種: <T> 返回值用法。
泛型方法:泛型方法的存在與所在的類是否為泛型無關。要定義泛型方法,只需將泛型參數列表置於返回值前,如:public class ExampleA { public 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 java.lang.Class。
使用泛型方法時,不必指明參數類型,編譯器會自動推斷出具體的類型。泛型方法除了定義上的差異外,在調用上與普通方法無異。
值得注意的是,一個靜態方法無法訪問泛型類的類型參數。因此,若要靜態方法能夠使用泛型能力,必須將其定義為泛型方法。例如:public static <T> void printType(T obj) { System.out.println(obj.getClass().getName()); } public static void main(String[] args) { printType(" "); printType(10); printType('a'); printType(new ExampleA()); },輸出結果為:java.lang.String java.lang.Integer java.lang.Character java.lang.Class。
通過這種方式,靜態方法可以使用泛型,增強其靈活性和類型安全性。泛型方法的使用大大簡化了代碼,減少了類型轉換的需要,提高了代碼的可讀性和可維護性。
在Java中,泛型方法的定義和調用遵循一定的規則。定義泛型方法時,需要在方法簽名中明確指定泛型參數。這些參數可以在方法內部使用,以實現類型安全。泛型方法的調用則更加靈活,編譯器會根據實際傳遞的參數類型推斷出具體的類型。
例如:public static <T> T safeGet(Map<String, T> map, String key) { return map.get(key); },這段代碼定義了一個泛型方法safeGet,它接受一個鍵值對映射和一個鍵,返回與鍵關聯的值。這種方法可以用於任何泛型類型,提高了代碼的通用性。
此外,泛型方法還支持泛型參數的上下文使用,這使得方法可以更靈活地處理不同類型的數據。例如:public static <T extends Comparable<T>> int compare(T a, T b) { return a.compareTo(b); },這段代碼定義了一個比較方法,可以用於任何實現了Comparable介面的類型,提供了類型安全的比較操作。
總之,泛型方法的使用使得Java程序更加靈活、安全和易於維護。通過正確地定義和使用泛型方法,開發者可以顯著提高代碼的質量和可讀性。