साथ एक पैरामिट्रीकृत प्रकार बदलने के लिए कैसे निम्नलिखित सेटअप पर विचार करें:अधिक विशिष्ट
public interface SuperType<V> {
}
SuperType
विधि श्रृंखलन का समर्थन करता है:
हम एक अंतरफलक SuperType
जो इस तरह parameterized है।
public interface SuperType<V, S extends SuperType<V, S>> {
public S doSomething();
}
के SuperType<V, S extends SuperType<V, S>>
के एक कार्यान्वयन पर विचार करें:
public class SubType<V> implements SuperType<V, SubType<V>> {
private final V value;
public SubType(V value) { this.value = value; }
public SubType<V> doSomething() { return this; }
}
किसी को दर्शाता है SubType<V>
उदाहरण स्ट्रिंग्स के लिए उपयोग कर रहा है, लेकिन Object
प्रदान करता है इसलिए यह एक और प्रकार पैरामीटर जो ठोस लागू करने उप प्रकार इस तरह प्रत्येक विधि द्वारा वापस कब्जा को परिभाषित करता है टाइप पैरामीटर V
:
Object s = "Java Generics";
SubType<Object> x = new SubType<>(s);
अब हम जो V
के अधिक विशिष्ट प्रकार पैरामीटर लेता है और एक ही कार्यान्वयन प्रकार S
लेकिन अब W extends V
साथ पैरामिट्रीकृत रिटर्न SuperType<V, S extends SuperType<V, S>>
के लिए एक और तरीका निर्धारित करना चाहते हैं:
public interface SuperType<V, S extends SuperType<V, S>> {
public S doSomething();
public <W extends V, T extends SuperType<W, T>> T doMoreSpecific(Class<W> typeToken);
}
इस नए इंटरफ़ेस परिभाषा का समर्थन करने का इरादा है:
Object s = "Java Generics";
SubType<Object> x = new SubType<>(s);
SubType<String> y = x.doMoreSpecific(String.class);
यहां मैं SubType<V>
को लागू करने के लिए संघर्ष करता हूं। क्या मैं एक कार्यान्वयन के रूप में प्रदान करने के लिए चाहते हैं:
public class SubType<V> implements SuperType<V, SubType<V>> {
private final V value;
public SubType(V value) { this.value = value; }
public SubType<V> doSomething() { return this; };
public <W extends V> SubType<W> doMoreSpecific(Class<W> typeToken) {
return new SubType<>((W) value);
}
}
मेरा प्रश्न है:
मैं कैसे प्रकार SuperType<V, S extends SuperType<V, S>>
द्वारा SubType<V> implements SuperType<V, SubType<V>>
है प्रदान की ताकि कार्यान्वयन में विधि doMoreSpecific()
के लिए हस्ताक्षर परिभाषित करना चाहिए स्वीकार्य?
या अन्यथा, कौन सा कार्यान्वयन और इंटरफ़ेस विधि परिभाषा चाल करेगा?
अन्यथा, हम जावा में ऐसा क्यों नहीं कर सकते?
सिर्फ एक commnet, एक अंतरफलक में, सभी तरीकों सार, कर रहे हैं तो स्पष्ट परिभाषा अनावश्यक –
'एस फैली' मान्य सिंटैक्स जो अपने प्रश्न को समझने के लिए कठिन बना देता है ... –
assylias
नहीं है मुझे आशा है कि मैं वाक्यविन्यास त्रुटियों तय । मैं अपने आईडीई में सभी प्रकार को परिभाषित करने के लिए आलसी था :)। माफ़ कीजिये। – Harmlezz