2015-07-03 36 views
-2

我來自C++背景,也是Java的新手。目前,我在編程Java和我有三個不同的功能做同樣的事情,但有不同的數據類型:Java中的C++模板

DataConnection1 Db1; 
DataConnection1 Db2; 
DataConnection1 Db3; 

fetchIdD1(Db1, Db2) 
{ 
    //`enter code here` 
} 
fetchIdD2(Db2, Db2) 
{ 
    //`enter code here` 
} 
fetchIdD3(Db3, Db2) 
{ 
    //`enter code here` 
} 

我知道,在C++中,我可以很容易地使用模板轉換成一個功能。

Java是否與模板等效,以便我也可以這樣做?

+0

自從我做了C++之後的很長一段時間,但是不會像泛型一樣嗎? – MadProgrammer

+0

請參閱:http://docs.oracle.com/javase/tutorial/java/generics/index.html 鑑於您是Java新手,我建議您閱讀Java教程的其餘部分。泛型是一個(相對)高級的Java主題,所以從基礎開始。 –

+0

在你的代碼中,你有三個變量'Db1,Db2,Db3'具有相同數據類型'DataConnection1'。爲了明確你的問題,你可以提供一個你想要轉換爲Java的*有效的* C++代碼。 –

回答

2

Java沒有模板,也沒有任何比模糊的類似。但是,它確實有一些名爲的泛型,它支持C++模板可以執行的一小部分(儘管以類型不安全的方式)。他們甚至在語法上看起來與C++模板有些相似。

聲明泛型類是這樣的:

class MyClass<T> { 
    public MyClass(T x) { 
     this.x = x; 
    } 
    T getX() { 
     return this.x; 
    } 
    private T x; 
}; 

你使用這樣的:

MyClass<String> str = new MyClass<>("Hello World!"); 
System.out.println(str.getX()); // prints Hello World! 

不能使用原始類型作爲類型參數。您需要使用盒裝的形式來代替:

MyClass<Integer> i = new MyClass<>(42); 
System.out.println(i.getX()); // prints 42 

聲明泛型方法是這樣的:

public <T> T getSomething(int i) { 
    T my_thing = new T(); // I can't remember, this might be a compile error 
    return my_thing; 
} 

,並調用它是這樣的:

getSomething<String>(7); 

當然,如果T用於參數列表中,可以省略<String>部分。

您還可以強制類型的參數來實現與語法<T extends Comparable<T>>一些接口 - 這個例子意味着你可以在T類型的對象調用.compareTo。還有一個<T super YourClass>語法,但我從來沒有完全理解它的含義。


還記得我在上面說泛型不是類型安全的嗎?這是由於類型擦除。簡而言之,泛型編譯完全像所有類型參數實際上是Object一樣。它們在編譯階段提供了一個類型檢查級別,但是在運行時,這些額外的類型信息會丟失 - 上面的示例MyClass不會爲與它一起使用的每個類型參數生成單獨版本的類(如同使用C++模板的情況),但只有一個類聲明,它用Object代替所有的T。可以聲明MyClass沒有類型參數(這稱爲原始類型),並且在這裏可能會遇到許多缺陷,例如在標準庫容器類中。

+0

謝謝你的回答。它幫助了我很多。 – PARDEEP