为什么scala.Function1和scala.Function2上的toString方法有括号
我正在实现为什么scala.Function1和scala.Function2上的toString方法有括号,function,scala,tostring,scala-ide,intellij-13,Function,Scala,Tostring,Scala Ide,Intellij 13,我正在实现(Int)=>String)的派生,并重写toString方法,如下所示: object A extends ((Int) => String) { override def toString: String = "A" def apply(int: Int): String = int.toString } IDEA IntelliJ表示正在从Function1.toString重写toString方法(Scala IDE也是如此)。IntelliJ还显示以下警告,指
(Int)=>String)
的派生,并重写toString
方法,如下所示:
object A extends ((Int) => String) {
override def toString: String = "A"
def apply(int: Int): String = int.toString
}
IDEA IntelliJ表示正在从Function1.toString
重写toString
方法(Scala IDE也是如此)。IntelliJ还显示以下警告,指示由于函数1.toString
声明包含空括号,必须将空括号添加到toString
方法中(Scala IDE不显示此警告):
空的paren Scala方法被重写为无参数
惯例是,如果方法有边,则包含括号
影响。根据Liskov替换原理,如
重写方法为空参数,重写方法也必须为空参数
声明为具有副作用的方法。*请参阅中的编程
Scala,5.3运算符是方法
然后我转到ScalaDoc并检查scala包中的()、()和()。在2.11.2的源代码中,Function1
和Function2
分别覆盖toString
方法,并包含空括号(而PartialFunction
仅使用Function1
的覆盖)。因此,给定Function1
和Function2
为toString
方法声明一个String
文本,我不理解为什么这两个类文件的源代码中会包含括号
在
toString
方法中使用括号,我缺少了什么明显的理由?或者IntelliJ警告不正确?或者,如果IntelliJ警告正确,为什么Scala IDE没有显示与IntelliJ相同的警告?覆盖定义f
覆盖定义f()
根据规范被假定为具有参数
您引用的IntelliJ消息说,有一个“约定”,即您应该包括parens,以证明该方法不仅仅是一个访问器,而且可能有副作用
并非所有人都同意或遵守这种符号化的“惯例”
在toString
的情况下,约定尤其是空的,因为许多toString
方法都有副作用,例如迭代器初始化状态
我最近在ML上问了这个问题:
我在后续行动中回答了自己的问题:
http://www.scala-lang.org/files/archive/spec/2.11/05-classes-and-objects.html#overriding
一条特殊规则涉及无参数方法。。。f也是假定的
使参数列表为空
这意味着您可以不使用覆盖定义中的paren
比如说,
scala> def f = 42
f: Int
scala> f()
<console>:9: error: Int does not take parameters
f()
^
scala> class X { def f() = 42 }
defined class X
scala> class Y extends X { override def f = 43 }
defined class Y
scala> new Y().f()
res1: Int = 43
scala>def=42
f:Int
scala>f()
:9:错误:Int不接受参数
f()
^
scala>类X{def()=42}
定义类X
scala>Y类扩展X{override def f=43}
定义类Y
scala>新的Y().f()
res1:Int=43
Y.f
的参数列表为空
由于Object.toString()
有一个空的参数列表,所以每个重写都是空的,包括对的重写
(Java的
toString()
被引用为提供参数的原因,在称为“空应用程序”的转换中)Tysvm用于回答。我已经读了你的答案三遍,也读了谷歌的帖子。我仍然不能自信地得出结论。那么,简单的答案是这样的吗?重写toString方法时不需要括号,这意味着IntelliJ的警告不正确。如果是这样的话,我会接受你的回答,如果你能把它(或者用你自己的话)放在顶部作为总结(或者tl;dr),这样未来的读者就可以快速得出结论,而无需深入阅读。如果没有,那么请帮助我理解我最后一段中三个问题的答案。如果答案是括号可以省略,你知道为什么它们没有省略scala.Function1和scala.Function2(特别是因为它们被分配了字符串文字)?我使用了更强的词。