[英]How to call a method depending on its type generic?
讓下面的代碼:
public abstract class MySuperClass {
public abstract void update();
/* ... */
}
public class A extends MySuperClass {
@Override
public void update() { /* ... */ }
/* ... */
}
public class B extends MySuperClass {
@Override
public void update() { /* ... */ }
/* ... */
}
public class Ticket<T extends MySuperClass> {
private Class<T> c;
public Ticket(Class<T> c){ this.c = c; }
public Class<T> getClass() { return this.c; }
public void update() { /* HOW TO DO! */ }
/* ... */
}
public class Main {
public static void main(String[] args) {
Ticket<A> myTicket1 = new Ticket<A>(A.class);
Ticket<B> myTicket2 = new Ticket<B>(B.class);
myTicket1.update();
myTicket2.update();
}
}
如何根據票證的類型( A
, B
)等升級票證?
Ticket
為何不知道更新的實際含義。 它只需要將調用轉發到MySuperClass
的實例。 泛型類的全部要點是,泛型類可以與任何對象(或對象的子集)一起使用,而不必確切知道它是什么類型。
public class Ticket<T extends MySuperClass> {
private T thing;
public Ticket(T thing) {
this.thing = thing;
}
public void update() {
thing.update();
}
/* ... */
}
update()是一個實例方法,因此您將需要一個實例來調用它。 這可以通過以下方式實現
getClass().newInstance().update();
由於多態性,它將從A或B調用正確的方法。但是要以一種更加面向對象的方式解決該問題,您應該將一個實例傳遞給Ticket構造函數,而只需調用update()。
我已經對您的示例進行了調整,以使其更有意義...並實現了update
。
public class Ticket<T extends MySuperClass> {
private Class<T> c;
private T t;
public Ticket(Class<T> c) throws InstantiationException, IllegalAccessException {
this.c = c;
this.t = c.newInstance();
}
public Class<T> getClass() {
return this.c;
}
public void update() {
t.update();
}
/* ... */
}
update
方法調用t.update()
,它將多態地分派到t
引用的實際對象的update
方法。 請注意,我添加了代碼來創建和存儲Class<T>
的實例。
更新 -我已將異常添加到Ticket
構造函數。 這是您使用反射來創建實例的價格的一部分……而不是使用new
來創建實例並將其作為參數傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.