2011-01-15 14 views
6

से सही प्रकार लौटें:जावा मैं निम्नलिखित वर्ग संरचना है जेनेरिक विधि

public class Team { 
    ... 
} 

public class Event { 

} 

public abstract class Fixture<T extends Team> implements Event { 
    ... 
} 

public abstract class Forecast<Event> { 

} 

public class MyPrediction<T extends Fixture<? extends Team>> extends Forecast<Fixture<? extends Team>>{ 

} 

मैं सभी प्रकार के खेल की घटनाओं (मॉडल करने के लिए कोशिश कर रहा हूँ यानी एक 'स्थिरता' एक विशेष खेल के बीच दो प्रतिभागियों खेलने के लिए है एक दूसरे के खिलाफ, जबकि किसी अन्य प्रकार के 'ईवेंट' में कई प्रतिभागी हो सकते हैं), विशेष 'घटनाक्रम' के परिणाम के पूर्वानुमान के साथ। मैं एक सामान्य विधि है:

public <T> MyPrediction<Fixture<? extends Team>> getMyPrediction(Fixture<? extends Team> fixture) { 

}

मैं एक MyPrediction उदाहरण है, जिसमें fixture तर्क के सामान्य प्रकार है वापस जाने के लिए सक्षम होना चाहते हैं, लेकिन मैं ऐसा नहीं कर पा रहे।

SoccerFixture<EnglishSoccerTeams> soccerMatch = new ScoccerFixture<EnglishSoccerTeams>(); 
MyPrediction<SoccerFixture<EnglishSoccerTeams>> = getMyPrediction(soccerMatch); 

मैं इस सुविधा को शामिल करने की मेरी कक्षा संरचना बदलने के लिए तैयार हूँ: उदाहरण के लिए, अगर मैं निम्नलिखित की तरह कुछ करते हैं, तो मैं एक संकलन त्रुटि मिलती है। ऐसा मैं किस प्रकार करूं?

+1

"अगर मैं निम्नलिखित की तरह कुछ करता हूं" ... तो (आपको क्या समस्या आती है)? –

+0

ऐसा लगता है कि ईवेंट को एक इंटरफेस होना चाहिए –

उत्तर

1

बदलें इस संकलक बताता है कि तर्क एक में स्थिरता प्रकार nd परिणाम वही हैं, टाइप-चेकिंग पास करने की इजाजत देता है।

यहां एक पूर्ण उदाहरण है, कुछ अन्य मामूली परिवर्तनों को संकलित करने के लिए। यह getMyPrediction विधि और एक doit विधि धारण करने के लिए नमूना उपयोग बताने के लिए वर्ग Predictor का परिचय:

public interface Team { 
} 

public interface Event { 
} 

public abstract class Fixture<T extends Team> implements Event { 
} 

public abstract class Forecast<T> { 
} 

public class MyPrediction<T extends Fixture<? extends Team>> extends 
     Forecast<Fixture<? extends Team>> { 
} 

public class SoccerFixture<T extends SoccerTeam> extends Fixture<T> { 
} 

public class SoccerTeam implements Team { 
} 

public class EnglishSoccerTeam extends SoccerTeam { 
} 

public class Predictor { 

    public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture) { 
     return new MyPrediction<T>(); 
    } 

    public void doit() { 
     SoccerFixture<EnglishSoccerTeam> soccerMatch = new SoccerFixture<EnglishSoccerTeam>(); 
     MyPrediction<SoccerFixture<EnglishSoccerTeam>> myPrediction = getMyPrediction(soccerMatch); 
    } 
} 

के रूप में कहीं उल्लेख किया, आप MyPrediction कार्यान्वयन में सार्थक काम को करने के लिए एक या अधिक कारखाने वस्तुओं को पेश करने की जरूरत हो सकती।

0

जावा के प्रकार प्रणाली पर्याप्त शक्तिशाली है कि तुम क्या प्रकार विलोपन (सामान्य मापदंडों रनटाइम पर उपलब्ध नहीं हैं।

सामान्य समाधान एक अलग EventFactory वर्ग बनाने के लिए है, जो आप कर सकते हैं है की वजह से प्रस्ताव सीधे करने के लिए नहीं है तो

public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture) 

को getMyPrediction के हस्ताक्षर किसी भी विधि है जो किसी खास ईवेंट उप प्रकार उदाहरण बनाने के लिए की जरूरत है करने के लिए गुजरती हैं।

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