[英]Java how to cast to a generic type
這是我的課程結構
public abstract class SuperClass
public class A extends SuperClass
public class B extends SuperClass
現在,我有一個框架,它將顯示一個A元素列表或一個B元素列表,以便不重復代碼,我想使其盡可能通用。 我的想法是將框架元素的類保存在字段中:
public class MyFrame extends Frame {
private final Class type; // type of the elements i'm going to display
private final DefaultListModel list; // elements to show in a SelectionList
public <T extends SuperClass> MyFrame(final List<T> elementsToDisplay, Class<T> type) {
this.list = createListModel(elementsToDisplay);
this.type = type;
}
現在可以像
List<A> list = new LinkedList<>(...);
MyFrame frame = new MyFrame(list, A.class);
我的問題是如何使用字段類型 ,例如,當在框架中選擇一項時,我想將其強制轉換為類型類,但我不知道如何使用。 以下幾行是偽代碼
<T extend SuperClass> foo(T item) { ... }
// ----
Object selectedItem = list.get(selectionList.getSelectedIndex());
[type.class] castedItem = type.cast(selectedItem);
foo(castedItem);
如何從Object轉換為持有類型的類 ?
如果您的目標確實是通過“使代碼盡可能最通用”來最大程度地減少代碼重復,那么為什么不這樣做呢?
class MyFrame<T extends SuperClass> {
private final DefaultListModel list;
public MyFrame(final List<T> elementsToDisplay) {
this.list = createListModel(elementsToDisplay);
}
}
不過,我要提醒您,使用泛型很容易過頭(尤其是在學習使用泛型之后:),這很可能是其中一種情況。 另外:作為一般經驗法則,只要您發現自己將通用類的類型存儲為該類的字段,就應該將其視為可能需要重新檢查設計的危險信號。
如果我正確理解了您的問題,那么使用泛型的主要原因是避免強制轉換,因此在您知道需要哪種對象的方法實現中,您不會使用<T extends SuperClass>
而是使用<A>
這樣的特定類會知道要使用的通用類型。 如果您想使用<T extends SuperClass>
保留該方法,則必須檢查該方法內部的class實例,並確定要<T extends SuperClass>
類型。 FE
if( object instanceof A)
((A)object).somethinkA();
else if(object instanceof B)
((B)object).somethinkB();
else
.....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.