繁体   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