Java如何转换为泛型类型

时间:2014-09-19 11:02:05

标签: java generics casting

这是我的班级结构

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

现在可以调用像

这样的smth
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转换为持有 类型 的类?

2 个答案:

答案 0 :(得分:2)

如果你的目标是真的,那么最大限度地减少代码重复,并使其尽可能最通用&#34; (原文如此),为什么不这样做

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

    public MyFrame(final List<T> elementsToDisplay) {
        this.list = createListModel(elementsToDisplay);
    }
}
但是,我会提醒你,使用仿制药很容易过度(特别是在你学会使用它们之后:),这很可能就是其中之一。另外:作为一般的经验法则,每当你发现自己将泛型类的类型存储为该类的字段时,你应该看到它是一个红旗,你可能需要重新检查你的设计。

答案 1 :(得分:0)

如果我正确理解你的问题,使用泛型的主要原因是为了避免投射,我想在你的方法实现中,你知道你需要什么类型的对象,你不会使用<T extends SuperClass>但是{{1}所以某些类将知道它的泛型类型。如果你想用<A>保持方法,那么你必须检查方法中的类的实例,并决定你将使用哪种类型。 f e

<T extends SuperClass>