के रूप में टिप्पणी में चर्चा की, अपने डिजाइन जरूरी है कि getCopy
विधि "आत्म प्रकार" वापसी - जो है, एक BlueStack<T>
कार्यान्वयन अपने getCopy
से एक BlueStack<T>
वापसी की उम्मीद की जाएगी, और RedStack<T>
एक RedStack<T>
आदि
लौटना चाहिए
दुर्भाग्यवश, जावा में "स्वयं प्रकार" व्यक्त करने का कोई तरीका नहीं है। के रूप में zhong.j.yu points out, एक पुनरावर्ती प्रकार पैरामीटर, करीब आता है उदाहरण के लिए:
//not recommended!
public interface Stack<S extends Stack<S, T>, T extends Item> {
S getCopy();
}
लेकिन जैसे zhong.j.yu का उल्लेख इस unintuitive है और अभी भी "झूठ बोल" और लौटने से एक BlueStack<T>
को रोकने के लिए विफल हो जाएगा getCopy
से।
इसके बजाय, मैं एक नया स्वरूप की अनुशंसा करता हूं। Stack
से स्वयं के ढेर की प्रतिलिपि बनाने की ज़िम्मेदारी को कम करने का प्रयास करें। उदाहरण के लिए:
public interface StackCopier<S extends Stack<T>, T extends Item> {
S copy(S original);
}
StackCopier
के कार्यान्वयन उनके संबंधित Stack
के निजी सदस्यों के लिए उपयोग की जरूरत है, उन्हें नेस्टेड कक्षाएं बनाने पर विचार, उदाहरण के लिए:
class BlueStack<T extends Item> implements Stack<T> {
...
static class Copier<T extends Item> implements StackCopier<BlueStack<T>, T> {
@Override
public BlueStack<T> copy(BlueStack<T> original) {
...
}
}
पाठ्यक्रम
SimpleFinder
के
को परिवर्तित करने की आवश्यकता होगी या तो एक StackCopier<S, T>
क्षेत्र है या find
का एक नया पैरामीटर के रूप में एक ले:
private final StackCopier<S, T> copier = ...;
public S find(S stack, int a) {
S stackCopy = copier.copy(stack);
...
return stackCopy;
}
क्या हासिल करने के लिए कार्रवाई का सबसे अच्छा तरीका है? आप इंटरफेस परिभाषाओं को बदलने में असमर्थ क्यों हैं? – Bobulous
ब्रूट कास्ट का प्रयास करें। इसे हल करने के तरीके हैं (रिकर्सिव टाइप पैरामीटर) लेकिन यह इसके लायक नहीं है। – ZhongYu
@ अर्कनॉन क्योंकि यह मेरा परिवर्तन नहीं है ...: | और क्रूर कास्ट बहुत बदसूरत है ना? – SadStudent