मान लीजिए कि मैं एक सामान्य इंटरफ़ेस है:
interface MyComparable<T extends Comparable<T>> {
public int compare(T obj1, T obj2);
}
और एक विधि sort
:
public static <T extends Comparable<T>>
void sort(List<T> list, MyComparable<T> comp) {
// sort the list
}
मैं इस पद्धति को लागू कर सकता हूं और तर्क के रूप में एक लंबोदर अभिव्यक्ति पारित कर सकता हूं:
List<String> list = Arrays.asList("a", "b", "c");
sort(list, (a, b) -> a.compareTo(b));
यह ठीक काम करेगा।
लेकिन अब अगर मैं इंटरफ़ेस को गैर-जेनेरिक, और विधि को सामान्य बनाता हूँ:
interface MyComparable {
public <T extends Comparable<T>> int compare(T obj1, T obj2);
}
public static <T extends Comparable<T>>
void sort(List<T> list, MyComparable comp) {
}
और फिर इस तरह से आह्वान करें:
List<String> list = Arrays.asList("a", "b", "c");
sort(list, (a, b) -> a.compareTo(b));
यह संकलन नहीं है। यह यह कहते हुए लंबोदर अभिव्यक्ति में त्रुटि दिखाता है:
"लक्ष्य विधि सामान्य है"
ठीक है, जब मैंने इसका उपयोग करके संकलित किया javac
, तो यह निम्नलिखित त्रुटि दिखाता है:
SO.java:20: error: incompatible types: cannot infer type-variable(s) T#1
sort(list, (a, b) -> a.compareTo(b));
^
(argument mismatch; invalid functional descriptor for lambda expression
method <T#2>(T#2,T#2)int in interface MyComparable is generic)
where T#1,T#2 are type-variables:
T#1 extends Comparable<T#1> declared in method <T#1>sort(List<T#1>,MyComparable)
T#2 extends Comparable<T#2> declared in method <T#2>compare(T#2,T#2)
1 error
इस त्रुटि संदेश से, ऐसा लगता है जैसे संकलक टाइप तर्कों का अनुमान लगाने में सक्षम नहीं है। क्या यह मामला है? यदि हाँ, तो ऐसा क्यों हो रहा है?
मैंने विभिन्न तरीकों की कोशिश की, इंटरनेट के माध्यम से खोज की। तब मुझे यह JavaCodeGeeks लेख मिला , जो एक रास्ता दिखाता है, इसलिए मैंने कोशिश की:
sort(list, <T extends Comparable<T>>(a, b) -> a.compareTo(b));
जो फिर से काम नहीं करता है, उस लेख के विपरीत जो यह दावा करता है कि यह काम करता है। संभव है कि यह कुछ शुरुआती बिल्ड में काम करता था।
तो मेरा सवाल यह है कि क्या जेनेरिक पद्धति के लिए लैम्ब्डा अभिव्यक्ति बनाने का कोई तरीका है? मैं एक विधि संदर्भ का उपयोग करके ऐसा कर सकता हूं, हालांकि एक विधि बनाकर:
public static <T extends Comparable<T>> int compare(T obj1, T obj2) {
return obj1.compareTo(obj2);
}
कुछ वर्ग कहते हैं SO
, और इसे पास करें:
sort(list, SO::compare);