簡體   English   中英

Java如何轉換為泛型類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM