是隐私吗?

时间:2016-10-19 17:21:31

标签: scala

给出以下代码:

class Foo[R](i: Int)(implicit ev: Ordering[R]) {
  final type T = ev.type
}

我收到以下错误:

  

错误:(13,16)私有值ev逃脱了其定义范围的一部分   键入Foo.this.ev.type       输入T = ev.type

这让我觉得构造函数中声明的含义是私有的。 鉴于T是最终的,它不会被覆盖,所以它不应该导致任何问题。我在这里错过了什么?

2 个答案:

答案 0 :(得分:5)

class构造函数中声明的所有参数都是private,除非您告诉编译器它们不是。这与case class不同,其中第一个参数列表中的所有参数默认为public,除非您告诉编译器。

所以,是的,除非您专门为该值添加val或其他类似公共的修饰符,否则默认为private。因此,它告诉您私人成员通过您定义type的方式被公开。

答案 1 :(得分:2)

我不认为这是因为它是隐含的。我认为这只是因为它是一个类参数(它是私有的)。如果删除隐式关键字,它仍然会给出相同的错误。另见Do scala constructor parameters default to private val?