我有两个共享一个公共祖先并实现一个通用接口的Java类层次结构。我需要将一个指针传递给另一个类中的某个方法。要求参数扩展了一个特定的类并实现了一个特定的接口
interface I { ... }
class A extends java.awt.Component implements I { ... }
class B extends java.awt.Component implements I { ... }
class D {
Component c;
I i;
void m(? x) {
c = (Component) x;
i = (I) x;
}
}
有什么我可以代替“?
”用,让我传递的任何“A
”或“B
”?如果我将“x
”投射到java.awt.Component
并将其存储在“c
”和I
中,并将其存储在“i
”中,我将失去强打字的好处。
我需要声明
class D {
void m(java.awt.Component c, I i) { ... }
}
,并与 'm(a, a)
' 或 'm(b, b)
' 把它在那里
A a = new A();
B b = new B();
我不能创建一个
abstract class C extends java.awt.Component implements I {...}
,并通过在因为A
和B
都不是C
。
顺便说一句,这可以在Scala中完成吗?
编辑:,我试图解决的实际问题是,我有两个班,一个扩展JInternalFrame
和另一个延伸JPanel
。两者都是抽象的,并为其中显示的小部件提供了一些常用功能(用户可以在其中编辑行,删除行等的JTable)。无论正在显示的基础对象类型如何,编辑和删除行的代码都是相同的。我有几种方法允许用户单击一行,从弹出菜单中选择“删除”,并在询问确认后删除所选的行和数据库对象。有时我需要一个框架子组件,有时候还需要一个面板子组件。我为该委托类型的每个抽象类中的常用功能和实例变量创建了一个委托类。 JInternalFrame
和JPanel
派生类然后只是将实际实现推迟到委托。反过来,委托类需要一个指向“所有者”类的指针以获取选定表格行等的回调,以及指向JOptionPane
确认对话框的每个父项的“Component
”性质的指针。
使用Java泛型方法工作得很好。委托类现在定义为<T extends Component & DelegateContainer
上的泛型类,每个所有者抽象类实现DelegateContainer
(其中声明了回调方法)。
如果我要在Scala中重写这个,我可能会做一些特质而不是创建一个委托类。例如,特征可以将删除功能“添加”到衍生具体类JInternalFrame
。
感谢您的及时回复。
A和B都是实现我的组件...这需要一个AbstractIComponent ...为什么这不适合你? – Arne 2010-09-01 19:10:59
@Arne:我不相信这会工作,因为'A'和'B'类不是'AbstractIComponent'类型。 – Ralph 2010-09-02 11:44:06