有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

scala从继承的受保护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
}

注意editsCompoundEdit(一个UndoManager的超类)中的受保护字段。我希望有一个与读取该字段同名的公共访问器。我该怎么做

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

共 (2) 个答案

  1. # 2 楼答案

    嗯,总是有反思的

    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