2014-09-19 46 views
0

這是我的階級結構的Java如何轉換爲通用型

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); 

如何從對象強制轉換爲類持有

+1

您正在尋找'instanceof'運算符,或者我不知道您在說什麼...... – Dariusz 2014-09-19 11:06:02

+0

爲什麼要將它轉換爲該類型? – 2014-09-19 11:06:59

+1

我認爲你將不得不進一步挖掘Java泛型...將MyFrame更改爲MyFrame 將是一個好的開始。 – headcr4sh 2014-09-19 11:07:34

回答

2

如果你的目標是真的通過「使之成爲最通用的可能」(原文如此),以儘量減少重複代碼,爲什麼不這樣做

class MyFrame<T extends SuperClass> { 
    private final DefaultListModel list; 

    public MyFrame(final List<T> elementsToDisplay) { 
     this.list = createListModel(elementsToDisplay); 
    } 
} 

我要提醒你,雖然,使用泛型很容易(特別是在學習使用它們之後),這可能就是其中一種情況。另外:根據一般的經驗法則,只要您發現自己將泛型類的類型存儲爲該類的某個字段,則應該將其看作是可能需要重新檢查設計的紅旗。

+0

你說得對,我不想「讓它變得儘可能通用」,對此很抱歉。是的,我在課堂宣言中忽略了這一點(這就是爲什麼我瘋了)。非常感謝你:)我注意到你的建議絕對正確。 – Manu 2014-09-19 12:09:59

0

如果我正確理解你的問題的主要原因使用泛型是避免鑄造我在你的方法實現想是這樣,你知道你需要什麼類型的對象,你不會使用<T extends SuperClass><A>,使某些類就知道了其使用的泛型類型。如果你想保持<T extends SuperClass>的方法,那麼你必須檢查方法內的類的實例,並決定你將投出哪種類型。 FE

if(object instanceof A) 
((A)object).somethinkA(); 

else if(object instanceof B) 
((B)object).somethinkB(); 

else 
.....