2015-07-02 31 views
5

मैं इस प्रकार एक निर्माता हस्ताक्षर के साथ एक वर्ग है। लेकिन मैं कन्स्ट्रक्टर को अधिभारित करना चाहता हूं, अगर आप फंक्शन func प्रदान नहीं करते हैं, तो यह केवल (item)->{return item;} का उपयोग करेगा। मैं एक निर्माता है कि इस तरह दिखता है लिखा है:जावा जेनेरिक प्रकार बेमेल त्रुटि

public <T> MyClass(Set<T> data){ 
    this(
     data, 
     (item)->{return item;} 
    ); 
} 

यह एक प्रकार मेल नहीं खाता त्रुटि पैदा समारोह मैं अपने निर्माता के लिए एक तर्क के रूप प्रदान कर रहा हूँ प्रकार T के एक मूल्य लेता है, और है कि एक ही रिटर्न क्योंकि मान, जो U होना चाहिए। मुझे समझ में नहीं आता कि बीजगणितीय प्रकार प्रणाली क्यों नहीं देखती है कि इस मामले में यू और टी समान हैं और यह ठीक है?

+0

आप की तरह '(आइटम) एक अनाड़ी वाक्य रचना की जरूरत नहीं है -> {वापसी आइटम;}', बस 'लिखने आइटम -> आइटम '। या, ठीक है, 'Function.identity() ' – Holger

+0

धन्यवाद @ होल्गर, मैंने' फंक्शन.डाइंडिटी()' –

उत्तर

7

सिस्टम को यह मानना ​​है कि टी और यू दो अलग-अलग प्रकार हैं, क्योंकि आपने उन्हें दो अलग-अलग नाम दिए हैं। लेकिन आप ऐसे ही अपने दूसरे ctor से अतिरिक्त सामान्य प्रकार निकाल सकते हैं:

Set<Integer> ints = new HashSet<>(); 
MyClass<String> myobj = new <Integer> MyClass (ints); 

अपना पहला निर्माता एक उम्मीद होती है:

public class MyClass <U>{ 
    public <T> MyClass(Set<T> data, Function<T,U> func) {...} 
    public MyClass(Set<U> data){ 
     this(
      data, 
      (item)->{return item;} 
     ); 
    } 
} 
+0

का उपयोग करने के लिए स्विच किया आह हाँ, मैं मूर्ख हूं। उफ़। मुझे लगता है कि टाइप मिस्चैच यू और टी के बीच था, यह महसूस नहीं कर रहा था कि मैंने प्रभावी रूप से अलग-अलग क्षेत्रों में दो अलग-अलग टीएस बनाए थे। यह पूरी तरह से हल किया गया, बहुत बहुत धन्यवाद! :) –

3

की दूसरी निर्माता का उपयोग कर अपने वर्ग का एक उदाहरण बनाने की कोशिश करते हैं Set<Integer> और Function<Integer,String> पैरामीटर, लेकिन आपका दूसरा कन्स्ट्रक्टर इसे Function<Integer,Integer> पास करने का प्रयास करेगा। यही कारण है कि आपका कोड संकलन पास नहीं करता है।

जब आप जेनेरिक कक्षाओं और विधियों को परिभाषित करते हैं, तो वे अपने प्रकार के पैरामीटर को प्रतिस्थापित कर सकते हैं जो कि किसी भी प्रकार के संयोजन के लिए मान्य होना चाहिए।

0

चूंकि आपने दो अलग-अलग प्रकार टी और यू घोषित किए हैं, इसलिए संकलक उचित रूप से सोचता है कि वे अलग हैं। वे एक ही कर रहे हैं, टी की घोषणा नहीं करते हैं और केवल यू का उपयोग करें:

public MyClass(Set<U> data){ 
    this(
     data, 
     (item)->{return item;} 
    ); 
} 
संबंधित मुद्दे