从继承的受保护Java字段生成公共访问器

从继承的受保护Java字段生成公共访问器,java,scala,inheritance,visibility,Java,Scala,Inheritance,Visibility,我如何才能完成以下工作: 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.sw

我如何才能完成以下工作:

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
}
请注意,
edits
CompoundEdit
中的受保护字段(一个
UndoManager
的超类)。我希望有一个与读取该字段同名的公共访问器。我该怎么做

<console>:8: error: super may be not be used on variable edits
         def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits
                                                                            ^
:8:错误:super不能用于变量编辑
def edits:java.util.Vector[javax.swing.undo.UndoableEdit]=super.edits
^

您不能更改继承字段的可见性,这是不允许的

在某些情况下,您可以通过使用composition来“模拟”这种行为,但显然无法实现CompoundEdit类

不确定“EditToBuEndone”,因为类中不存在此方法:

嗯,总是有反射的

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
)。

抱歉,
editToBeUndone
位于
UndoManager
中(这是我实际扩展的类)。无论如何由于我可以添加一个名为
edits
的方法,我只是想知道,是否有什么技巧可以通过某种限定来引用字段
edits
,而不是尝试
super.edits