这是我的班级结构
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;
}
现在可以调用像
这样的smthList<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转换为持有 类型 的类?
答案 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>