日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

[CareerCup] 14.4 Templates Java模板

發布時間:2025/3/20 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [CareerCup] 14.4 Templates Java模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

14.4 Explain the difference between templates in C++ and generics in Java.

?

在Java中,泛式編程Generic Programming的實現是通過一種就做類型擦除Type Erasure的機制來實現的。當源碼轉為Java虛擬機JVM的字節代碼時擦除參數的類型,例如下面的例子:

Vector<String> vector = new Vector<String>(); vector.add(new String("hello")); String str = vector.get(0);

在編譯過程中,被重寫為:

Vector vector = new Vector(); vector.add(new String("hello")); String str = (String) vector.get(0);

?

這跟C++中有很大的不同。在C++中,模板是一個宏設置Macro Set,編譯器對每一個類型的模板代碼都創建一份拷貝。驗證這一點可以通過以下事實: MyClass<Foo>的一個實例不會跟MyClass<Bar>共享一個靜態變量,但是兩個MyClass<Foo>之間會共享一個靜態變量,參見如下代碼:

template<class T> class MyClass { public:static int val;MyClass(int v) { val = v; } };template<typename T> int MyClass<T>::val;class Foo; class Bar;int main() {MyClass<Foo> *foo1 = new MyClass<Foo>(10);MyClass<Foo> *foo2 = new MyClass<Foo>(15);MyClass<Bar> *bar1 = new MyClass<Bar>(20);MyClass<Bar> *bar2 = new MyClass<Bar>(35);cout << foo1->val << endl; // will equal 15cout << foo2->val << endl; // will equal 15cout << bar1->val << endl; // will equal 35cout << bar2->val << endl; // will equal 35return 0; }

?

而在Java中,靜態變量會在所有的MyClass的實例中共享,不論其參數是否相同,參見下列代碼:

public class Foo {} public class Bar {}public static class MyClass<T> {public static int val;public MyClass(int v) { val = v; } }public static void main (String[] args) {System.out.println("Hello World!");MyClass<Foo> foo1 = new MyClass<Foo>(10);MyClass<Foo> foo2 = new MyClass<Foo>(15);MyClass<Bar> bar1 = new MyClass<Bar>(20);MyClass<Bar> bar2 = new MyClass<Bar>(35);System.out.println(foo1.val); // will equal 35System.out.println(foo2.val); // will equal 35System.out.println(bar1.val); // will equal 35System.out.println(bar2.val); // will equal 35 }

?

由于架構的不同,Java的泛式編程和C++的模板還有許多不同:

- C++可以使用主要類型,例如int,而Java只能使用Integer

- Java中,你可以限制模板的參數類型為一個確定的類型。例如,你可能使用泛式編程來實現一個CardDeck,限定其參數類型必須從CardGame派生過來。

- C++中的參數類型可以被實例化,而Java中的不行。

- 在Java中,參數類型(例如MyClass<Foo>中的Foo)不能用于靜態方法或變量,因為這些會被MyClass<Foo>和MyClass<Bar>所共享。而C++中這些類是不同的,所以可以用于靜態方法或變量中。

- 在Java中,MyClass的所有實例,不管其參數類型是什么,都是同一個類型,其參數類型在運行時被擦除了。而C++中,擁有不同參數類型的實例是不同的類型。

?

總結

以上是生活随笔為你收集整理的[CareerCup] 14.4 Templates Java模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。