मैं निम्नलिखित सरल उदाहरण में मेरी समस्या को वर्णन करने की कोशिश करेंगे:मैं एकल बाधा में विधि और वर्ग प्रकार पैरामीटर दोनों का उपयोग कैसे कर सकता हूं?
public class DataHolder<T> {
private final T myValue;
public DataHolder(T value) {
myValue = value;
}
public T get() {
return myValue;
}
// Won't compile
public <R> DataHolder<R super T> firstNotNull(DataHolder<? extends R> other) {
return new DataHolder<R>(myValue != null ? myValue : other.myValue); }
public static <R> DataHolder<R> selectFirstNotNull(DataHolder<? extends R> first,
DataHolder<? extends R> second) {
return new DataHolder<R>(first.myValue != null ? first.myValue : second.myValue);
}
}
यहाँ मैं this
और other
तर्क के T
, इसलिए सामान्य विधि firstNotNull
कि DataHolder
प्रकार पैरामीटर के आम महाप्रकार द्वारा parametrized रिटर्न लिखना चाहते हैं बाद में मैं लिख सकता था उदाहरण के लिए
DataHolder<Number> r = new DataHolder<>(3).firstNotNull(new DataHolder<>(2.0));
या
DataHolder<Object> r = new DataHolder<>("foo").firstNotNull(new DataHolder<>(42));
समस्या यह है कि firstNotNull
की इस परिभाषा संदेश के साथ संकलक द्वारा अस्वीकार कर दिया है कि प्रकार बाधा के super T
हिस्सा अवैध (वाक्य रचना) है। हालांकि इस बाधा परिभाषा के बिना भी गलत (स्पष्ट रूप से) है, क्योंकि इस मामले में T
और R
एक-दूसरे से असंबंधित नहीं हैं।
दिलचस्प बात यह है कि समान स्थिर विधि selectFirstNotNull
की परिभाषा सही है और बाद में अपेक्षित कार्य करता है। क्या जावा टाइप सिस्टम में गैर स्थैतिक तरीकों के साथ समान लचीलापन हासिल करना संभव है?
DataHolder। यह वाक्य रचनात्मक रूप से संभव नहीं है। इसके अलावा, यह स्थिर बनाम गैर स्थैतिक बाधाओं के बारे में कोई सवाल नहीं है। स्थैतिक और गैर स्थैतिक विधि टाइप पैरामीटर के संबंध में समान नहीं हैं। –
CKing
ऐसा लगता है कि सुपर वाइल्डकार्ड का उपयोग प्रकार के साथ नहीं किया जा सकता है, और इसका उपयोग केवल सुपर ऑब्जेक्ट>, मैं इसके बारे में भी निश्चित नहीं हूं। – Artemkller545