রিভেনহিলের @ বিডি: যেহেতু এই পুরানো প্রশ্নটি গত বছর নতুন করে দৃষ্টি আকর্ষণ করেছে, কেবল আলোচনার জন্য আসুন আমরা কিছুটা এগিয়ে যাই। আপনার doIt
পদ্ধতির বডিটি কিছু-বিশেষ কিছু করে না T
। এটা এখানে:
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
সুতরাং আপনি সমস্ত ধরণের ভেরিয়েবল এবং জাস্ট কোড সম্পূর্ণরূপে বাদ দিতে পারেন
public class Clazz {
static void doIt(Object object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
ঠিক আছে. তবে আসুন মূল সমস্যাটির আরও কাছাকাছি আসা যাক। শ্রেণীর ঘোষণায় প্রথম ধরণের ভেরিয়েবল অপ্রয়োজনীয়। পদ্ধতিতে কেবল দ্বিতীয়টির প্রয়োজন। এখানে আমরা আবার যাই, তবে এটি চূড়ান্ত উত্তর নয়, এখনও:
public class Clazz {
static <T extends Saying> void doIt(T object) {
System.out.println("shake that booty "+ object.say());
}
public static void main(String args[]) {
Clazz.doIt(new KC());
Clazz.doIt(new SunshineBand());
}
}
// Output:
// KC
// Sunshine
interface Saying {
public String say();
}
class KC implements Saying {
public String say() {
return "KC";
}
}
class SunshineBand implements Saying {
public String say() {
return "Sunshine";
}
}
তবে নিম্নলিখিত সংস্করণটি ঠিক একইভাবে কাজ করে, এগুলি কিছুই সম্পর্কে খুব বেশি হট্টগোল হয়। এটির জন্য যা দরকার তা হ'ল পদ্ধতি প্যারামিটারের ইন্টারফেস টাইপ। দৃষ্টিতে কোনও ধরণের ভেরিয়েবল নেই। আসলেই কি আসল সমস্যা ছিল?
public class Clazz {
static void doIt(Saying object) {
System.out.println("shake that booty "+ object.say());
}
public static void main(String args[]) {
Clazz.doIt(new KC());
Clazz.doIt(new SunshineBand());
}
}
interface Saying {
public String say();
}
class KC implements Saying {
public String say() {
return "KC";
}
}
class SunshineBand implements Saying {
public String say() {
return "Sunshine";
}
}