एक सामान्य निर्माता का एक उद्देश्य कुछ सामान्य तरीकों के समान हो सकता है: यह सुनिश्चित करने के लिए कि कई तर्क एक ही प्रकार का संदर्भ लें।
निम्नलिखित उदाहरण पर विचार (हाँ, यह थोड़ा काल्पनिक है, लेकिन बिंदु दिखाना चाहिए):
import java.util.ArrayList;
import java.util.Collection;
public class GenericConstructorTest
{
public static void main(String[] args)
{
Collection<String> strings = new ArrayList<String>();
ClassWithParam c0 = new <String>ClassWithParam("String", strings);
}
}
class ClassWithParam
{
public <T> ClassWithParam(T data, Collection<T> collection)
{
collection.add(data);
}
}
यह वर्ग या उसके निर्माता जो प्रकार वास्तव में वहाँ प्रयोग किया जाता है के लिए कोई फर्क नहीं पड़ता। यह जानना केवल इतना महत्वपूर्ण है कि दूसरा तर्क के रूप में दिया गया संग्रह उस प्रकार के तत्व ले सकता है जो पहले तर्क के रूप में दिया गया था।
(मैं एक और यथार्थवादी, व्यावहारिक उदाहरण दिखाना चाहता हूं, लेकिन लगता है कि इस तरह से एक कन्स्ट्रक्टर को पैरामीटर बनाने के लिए शायद ही कभी आवश्यक है, और कोई यह भी विचार कर सकता है कि यह संभावना का "साइड इफेक्ट" है तरीकों, और यह तथ्य parameterize कोई कारण स्पष्ट अस्वीकृत करने के लिए निर्माताओं के लिए इस वहाँ है कि ...)
संपादित करें टिप्पणी में अनुरोध के अनुसार, और उदाहरण है, जहां दिए गए तर्कों के atually उपयोग किया जाता है। यह अभी भी बल्कि contrved है। अधिक यथार्थवादी उदाहरण संरचनात्मक रूप से समान हो सकता है और श्रोताओं के कुछ प्रकार की जानकारी दे सकती है, लेकिन बहुत अधिक कोड शामिल होगा:
public class GenericConstructorTest
{
public static void main(String[] args)
{
Callback<String> callback = new Callback<String>();
ClassWithParam c0 = new <String>ClassWithParam("String", callback);
c0.execute();
}
}
class ClassWithParam
{
private Runnable runnable;
public <T> ClassWithParam(final T data, final Callback<T> callback)
{
runnable = new Runnable()
{
@Override
public void run()
{
callback.call(data);
}
};
}
void execute()
{
runnable.run();
}
}
class Callback<T>
{
void call(T t)
{
System.out.println("Called with "+t);
}
}
दूसरे उदाहरण है कि आप
Integer val = new <String>Integer(100);
तैनात संकलन नहीं है जावा 7 के साथ ग्रहण में।यह शिकायत करता है
कंस्ट्रक्टर इंटीजर (int) प्रकार इंटीजर सामान्य नहीं है; यह, तर्क
जावा 8 में, यह अनुमति दी है साथ parameterized नहीं किया जा सकता हालांकि यह अभी भी एक चेतावनी जारी करता है:
प्रकार पूर्णांक के गैर सामान्य निर्माता पूर्णांक (पूर्णांक) के लिए
अप्रयुक्त प्रकार तर्क; यह तर्क
साथ parameterized नहीं किया जाना चाहिए
बस एक जंगली अनुमान (यदि यह अंतर क्या आप वास्तव में रूचि है, तो आपको एक अलग प्रश्न के रूप में इस पूछ पर विचार हो सकता है), लेकिन मैं इसे क्योंकि संकलित लगता है प्रकार गुम हो गया है। सही तरीका 'नया इंटीजर (100) होगा; 'या' नया MyClass (12); '। –
Tom
@Tom 'नया MyClass' का उपयोग किया जाएगा यदि * कक्षा केवल * पैरामीटर था, जैसे 'क्लास MyClass '। लेकिन इस मामले में, यह निर्माता है जिसमें पैरामीटर है, और इसे इस तरह लिखना सामान्य तरीकों या रचनाकारों को कॉल करने का मानक तरीका है। –
Marco13