@BD tại Rivenhill: Vì câu hỏi cũ này đã nhận được sự chú ý vào năm ngoái, chúng ta hãy tiếp tục một chút, chỉ để thảo luận. Cơ thể của doIt
phương pháp của bạn không làm gì cả - T
cụ thể. Đây là:
public class Clazz<T> {
static <T> void doIt(T object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Vì vậy, bạn hoàn toàn có thể loại bỏ tất cả các biến loại và chỉ cần mã
public class Clazz {
static void doIt(Object object) {
System.out.println("shake that booty '" + object.getClass().toString()
+ "' !!!");
}
// ...
}
Đồng ý. Nhưng hãy trở lại gần hơn với vấn đề ban đầu. Biến loại đầu tiên trên khai báo lớp là dự phòng. Chỉ có cái thứ hai về phương pháp là cần thiết. Ở đây chúng tôi đi một lần nữa, nhưng nó chưa phải là câu trả lời cuối cùng:
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";
}
}
Tuy nhiên, tất cả đều quá ồn ào về việc không có gì, vì phiên bản sau hoạt động theo cùng một cách. Tất cả những gì nó cần là loại giao diện trên tham số phương thức. Không có biến loại trong tầm nhìn ở bất cứ đâu. Đó thực sự là vấn đề ban đầu?
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";
}
}