में टाइप चेकर को टमिंग करना मैंने सोचा कि मैं जेनरिक को बहुत अच्छी तरह समझता हूं, लेकिन स्पष्ट रूप से मैंने नहीं किया।जावा जेनरिक
import java.util.ArrayList;
class Job<J extends Job<J,R>, R extends Run<J,R>> {}
class Run<J extends Job<J,R>, R extends Run<J,R>> {}
class Job2 extends Job<Job2,Run2> {}
class Run2 extends Run<Job2,Run2> {}
class RunList<J extends Job<J,R>, R extends Run<J,R>> extends ArrayList<R> {}
class Foo {
// #1 problem
public void test1(RunList<Job,Run> why) {}
// #2 this doesn't work either
public void test2(RunList<Job<Job,Run>,Run<Job,Run>> why) {}
// #3 this works
public void test3(RunList<Job2,Run2> why) {}
}
संकलक हुए कहा कि "नौकरी" अपनी तरह सीमा के भीतर नहीं है ऊपर test1 विधि की अनुमति नहीं है,:
यहाँ समस्या के परीक्षण का मामला है। मैं थोड़े प्रकार को समझता हूं --- Job
कच्चे प्रकार के रूप में Job<Job,Run>
का विस्तार नहीं करता है, इसलिए त्रुटि। इसके विपरीत, test3 काम करता है।
अब सवाल यह है कि, मैं यह काम कैसे कर सकता हूं? मैंने # 2 की कोशिश की है, लेकिन यह या तो काम नहीं करता है। मुझे लगता है कि समस्या वास्तव में # 1 --- Job<Job,Run>
के साथ समान है सीमाओं के भीतर नहीं है क्योंकि इसके प्रकार तर्क Job
एक कच्चा प्रकार है।
क्या कोई जानता है कि प्रकार के चेकर को कच्चे प्रकार के उपयोग के अलावा खुश कैसे किया जाए? या यह जावा टाइप सिस्टम में अभी उपलब्ध नहीं है?
तुम क्या आप काम करना चाहते हैं पर कोई अतिरिक्त जानकारी प्रदान कर सकते हैं? ऐसा लगता है कि आपके पास समाधान है - आप कौन सी काम करना चाहते हैं, और क्यों? – mlschechter
ध्यान दें कि # 3 अर्थात् अलग है, और यह कोई समाधान नहीं है --- यह एक कामकाज भी नहीं है। # 3 प्रभावी रूप से आपको ArrayList देता है, और इसलिए उदाहरण के लिए आप वहां सादे रन ऑब्जेक्ट नहीं जोड़ सकते हैं। मैं सादे जॉब्स और रन के साथ रनलिस्ट चाहता हूं, उदाहरण के लिए मैं इसमें सादा रन ऑब्जेक्ट डाल सकता हूं। # 2, अगर काम किया, तो कुछ समान प्राप्त होगा। –