我试过
scala> class Foo extends Component { var font = new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12) }
我得到了:
<console>:10: error: overriding variable font in class Component of type java.awt.Font;
variable font needs `override' modifier
class Foo extends Component { var font = new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12) }
^
所以我试过
scala> class Foo extends Component { override var font = java.awt.new Font("Helvetica", java.awt.Font.BOLD, 12) }
但这根本没有帮助:
<console>:10: error: overriding variable font in class Component of type java.awt.Font;
variable font has incompatible type
class Foo extends Component { override var font = new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12) }
^
这个错误背后的原因是什么,应该如何正确完成?
编辑:抱歉,没看到scala也有Component
。有问题的Component
来自java.awt.Component
!
答案 0 :(得分:5)
组件包含font
的getter和setter,因此设置字体的规范方法是:
class Foo extends Component {
font = new java.awt.Font(/* blah blah */)
}
如果要覆盖字体defs以使用var,,则必须使用与 scala.swing.Font
兼容的内容,它包装Java字体(通常使用隐式转换完成)。像这样:
class Foo extends Component {
override var font: scala.swing.Font =
new java.awt.Font("Helvetica", java.awt.Font.BOLD, 12)
}
我不确定这会做你想要的。 (编辑:在加载了太多垃圾的REPL会话中测试;你实际上不需要这样做!简单的覆盖var font = new java.awt.Font是有效的。)正常的getter / setter旨在通过有关通过javax.swing
同行的信息。如果你这样做,你可能会打破转发。所以使用第一种方法。
如果您尝试在java.awt.Component
中执行此操作,请进行修改:Font font;
是java.awt.Component
中的私有字段。您不能覆盖Java中的字段,也不能使用Java中的私有字段执行任何。因此,尝试使用新的var覆盖它将保证不起作用。 (然而,编译器当然可以提供更具信息性的错误消息!)Scala只能覆盖字段,因为它们不是真正的字段 - 它们是引用隐藏的底层字段的getter / setter对。
您应该使用(或覆盖)getFont
和setFont
代替。