मुख्य अंतर जिस तरह से लागू किया गया है, लेकिन उनके नाम सटीक रूप से उनके कार्यान्वयन का वर्णन करते हैं।
टेम्पलेट्स टेम्पलेट्स की तरह व्यवहार करते हैं। इसलिए, यदि आप लिखना: प्रत्येक प्रकार के जो कॉल करने के लिए f
एक नया कोड है प्रयोग किया जाता है के लिए
void f_generated_with_int(int s)
{
std::cout << s << '\n';
}
...
int x = 0;
f_generated_with_int(x);
...
तो,: तो अंत संकलक में की तरह व्यवहार करता है कोड
template<typename T>
void f(T s)
{
std::cout << s << '\n';
}
...
int x = 0;
f(x);
...
संकलक टेम्पलेट लागू होता है, "उत्पन्न"।
दूसरी तरफ, जेनेरिक केवल टाइप चेक किया जाता है, लेकिन फिर सभी प्रकार की जानकारी मिटा दी जाती है। इसलिए, यदि आप लिखना:
class X<T> {
private T x;
public T getX() { return x; }
public void setX(T x) { this.x = x; }
}
...
Foo foo = new Foo();
X<Foo> x = new X<>();
x.setX(foo);
foo = x.getX();
...
जावा इसे पसंद संकलित:
class X {
private Object x;
public Object getX() { return x; }
public void setX(Object x) { this.x = x; }
}
...
Foo foo = new Foo();
X x = new X();
x.setX(foo);
foo = (Foo)x.getX();
...
अंत में:
- टेम्पलेट्स टेम्प्लेटेड समारोह (प्रत्येक के संकलन में की गई प्रत्येक कॉल की इन्स्टेन्शियशन आवश्यकता होती है। सीपीपी फ़ाइल), इसलिए जनरेट्स के साथ
- संकलित करने के लिए टेम्पलेट धीमे हैं, आप प्राइमेटिव्स का उपयोग नहीं कर सकते हैं, क्योंकि वे
Object
नहीं हैं, इसलिए जेनेरिक कम विपरीत है टाइल
http://stackoverflow.com/questions/31693/ – n611x007