2014-10-04 10 views
6

जावा कंस्ट्रक्टर्स सामान्य हो सकते हैं: http://docs.oracle.com/javase/tutorial/java/generics/methods.htmlजावा सामान्य कंस्ट्रक्टर्स वाक्य रचना और उद्देश्य

हालांकि मैं कैसे घोषित करने और सामान्य निर्माता आह्वान करने के लिए का एक अच्छा उदाहरण नहीं मिल सकता है। इसके अलावा मैं जेनेरिक कन्स्ट्रक्टर के उद्देश्य को समझ नहीं पा रहा हूं क्योंकि प्रकार पैरामीटर का दायरा कन्स्ट्रक्टर तक ही सीमित है।

जेनेरिक निर्माता के साथ कक्षा के बाद:

public class MyClass { 

    public <T> MyClass(T data) { 
     // ... 
    } 

} 

हम के रूप में यह आह्वान:

MyClass obj = new <Integer>MyClass(12); 

तो मेरी प्रश्न हैं:

  1. सामान्य निर्माता का उद्देश्य क्या है? क्या आप जेडीके या अपने उदाहरण से एक उदाहरण दिखा सकते हैं?

  2. क्यों

    Integer val = new <String>Integer(100); 
    

की तरह बयान भी जब वर्ग पूर्णांक सामान्य निर्माता नहीं है त्रुटि के बिना संकलित किया गया है?

+0

बस एक जंगली अनुमान (यदि यह अंतर क्या आप वास्तव में रूचि है, तो आपको एक अलग प्रश्न के रूप में इस पूछ पर विचार हो सकता है), लेकिन मैं इसे क्योंकि संकलित लगता है प्रकार गुम हो गया है। सही तरीका 'नया इंटीजर (100) होगा; 'या' नया MyClass (12); '। – Tom

+2

@Tom 'नया MyClass ' का उपयोग किया जाएगा यदि * कक्षा केवल * पैरामीटर था, जैसे 'क्लास MyClass '। लेकिन इस मामले में, यह निर्माता है जिसमें पैरामीटर है, और इसे इस तरह लिखना सामान्य तरीकों या रचनाकारों को कॉल करने का मानक तरीका है। – Marco13

उत्तर

6

एक सामान्य निर्माता का एक उद्देश्य कुछ सामान्य तरीकों के समान हो सकता है: यह सुनिश्चित करने के लिए कि कई तर्क एक ही प्रकार का संदर्भ लें।

निम्नलिखित उदाहरण पर विचार (हाँ, यह थोड़ा काल्पनिक है, लेकिन बिंदु दिखाना चाहिए):

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 नहीं किया जाना चाहिए

+3

एफडब्ल्यूआईडब्ल्यू, यह * सूर्य जावा 7 कंपाइलर के साथ संकलित करता है। मुझे नहीं पता कि यह सन कंपाइलर या ग्रहण कंपाइलर है, हालांकि यह गलती है। –

+0

@ ओलिवर चार्ल्सवर्थ दिलचस्प, मुझे इसका परीक्षण करना चाहिए था। यह एक चेतावनी भी मुद्रित नहीं करता है। हो सकता है कि मैं जेएलएस को यह देखने के लिए खो दूंगा कि यह ग्रहण कंपाइलर में एक बग के रूप में माना जा सकता है (एक छोटे से वेबसार्च से, * संबंधित * बग्स प्रतीत होते हैं, लेकिन अभी तक यह नहीं मिला है जो वास्तव में * इस * मामले से मेल खाता है) – Marco13

+0

ऐसे कन्स्ट्रक्टर के व्यावहारिक उपयोग की कल्पना करना मुश्किल है: यह इनपुट संग्रह को संशोधित करता है लेकिन फिर इसे कक्षा के क्षेत्र में संग्रहीत नहीं कर सकता है या बस इसे वापस कर सकता है। – ako

संबंधित मुद्दे