ধরুন আমি একটি জেনেরিক ইন্টারফেস করেছি:
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
এই ত্রুটি বার্তা থেকে, দেখে মনে হয় যে সংকলক প্রকারের আর্গুমেন্টগুলি নির্ধারণ করতে সক্ষম নয়। এটাই কি? যদি হ্যাঁ, তবে কেন এমন হচ্ছে?
আমি বিভিন্ন উপায়ে চেষ্টা করেছি, ইন্টারনেটে অনুসন্ধান করেছি। তারপরে আমি এই জাভাকোডিজিক্স নিবন্ধটি পেয়েছি , যা একটি উপায় দেখায়, তাই আমি চেষ্টা করেছি:
sort(list, <T extends Comparable<T>>(a, b) -> a.compareTo(b));
যা আবার কাজ করে না, সেই নিবন্ধটি দাবি করে যে এটি কাজ করে to সম্ভব হতে পারে যে এটি কিছু প্রাথমিক বিল্ডে কাজ করত।
সুতরাং আমার প্রশ্ন: জেনেরিক পদ্ধতির জন্য ল্যাম্বডা এক্সপ্রেশন তৈরির কোনও উপায় আছে কি? আমি যদিও কোনও পদ্ধতি তৈরি করে একটি পদ্ধতি রেফারেন্স ব্যবহার করে এটি করতে পারি:
public static <T extends Comparable<T>> int compare(T obj1, T obj2) {
return obj1.compareTo(obj2);
}
কিছু ক্লাসে বলে SO
, এবং এটি পাস:
sort(list, SO::compare);