从inheritance的受保护Java字段创建公共访问器

我该如何进行以下工作:

class Foo extends javax.swing.undo.UndoManager { // increase visibility - works for method override def editToBeUndone: javax.swing.undo.UndoableEdit = super.editToBeUndone // fails for field def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits } 

请注意, editsCompoundEditUndoManager的超类)中的受保护字段。 我想要一个具有相同名称的公共访问器来读取该字段。 我该怎么办?

 :8: error: super may be not be used on variable edits def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits ^ 

好吧,总会有反思。

 class Foo extends javax.swing.undo.UndoManager { def edits(): java.util.Vector[javax.swing.undo.UndoableEdit] = classOf[javax.swing.undo.CompoundEdit]. getDeclaredField("edits").get(this). asInstanceOf[java.util.Vector[javax.swing.undo.UndoableEdit]] } 

您也可以通过嵌套来消除两个调用的歧义,尽管这很难看:

 class PreFoo extends javax.swing.undo.UndoManager { protected def editz = edits } class RealFoo extends PreFoo { def edits() = editz } 

但是你确实需要() – 没有它与字段本身冲突(并且你不能用def覆盖val )。

您无法更改inheritance字段的可见性,这是​​不允许的。

在某些情况下,您可以通过使用合成来“模拟”此类行为,但您将无法显然实现CompoundEdit类。

不确定’editToBeUndone’,因为该方法在类中不存在: http ://docs.oracle.com/javase/6/docs/api/javax/swing/undo/CompoundEdit.html