Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么scala.Function1和scala.Function2上的toString方法有括号_Function_Scala_Tostring_Scala Ide_Intellij 13 - Fatal编程技术网

为什么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(特别是因为它们被分配了字符串文字)?我使用了更强的词。