在 class 中实例化特征时出错(方法变为私有)
Getting error when instantiating a trait within a class (method became private)
在下面的代码中,我试图用 Decorator
class 实例化特征 A 并向其添加一个方法 p
以便我可以获得另一个对象 A 但是使用 p
方法:
trait A {
def x: Int
}
case class Decorator(a: A) {
def withPrint: A = new A {
val x = 100
def p: Unit = println(x)
}
}
val a = new A {val x = 100}
val d = Decorator(a).withPrint
但是当我尝试调用 d.p
时出现错误
value p is not a member of A$A54.this.A
然后我在 d
中打印声明的方法我看到 p
是 private!
d.getClass.getDeclaredMethods.foreach(println)
# public int stringsimilarity.A$A55$A$A55$Decorator$$anon.x()
# private void stringsimilarity.A$A55$A$A55$Decorator$$anon.p()
谁能解释为什么会这样?任何帮助将不胜感激!谢谢!
没有理由 def p
应该是 public。这是您在实现特征 A
的本地匿名 class 中定义的方法。 trait A
只声明了 public 方法 x
,没有别的。因此,您可以访问 p
的唯一范围是 new A { ... }
的初始化程序内部,因此 private
似乎适合于此。
如果你想公开方法p
,你可以将它添加到A
(然后你必须在那里实现它,然后你也不需要withPrint
方法),或者混合一个额外的特征来保证方法 p
的存在。例如:
trait A {
def x: Int
}
trait Print {
def p: Unit
}
case class Decorator(a: A) {
def withPrint: A with Print = new A with Print {
val x = 100
def p: Unit = println(x)
}
}
val a = new A { val x = 100 }
val d = Decorator(a).withPrint
d.p
在下面的代码中,我试图用 Decorator
class 实例化特征 A 并向其添加一个方法 p
以便我可以获得另一个对象 A 但是使用 p
方法:
trait A {
def x: Int
}
case class Decorator(a: A) {
def withPrint: A = new A {
val x = 100
def p: Unit = println(x)
}
}
val a = new A {val x = 100}
val d = Decorator(a).withPrint
但是当我尝试调用 d.p
时出现错误
value p is not a member of A$A54.this.A
然后我在 d
中打印声明的方法我看到 p
是 private!
d.getClass.getDeclaredMethods.foreach(println)
# public int stringsimilarity.A$A55$A$A55$Decorator$$anon.x()
# private void stringsimilarity.A$A55$A$A55$Decorator$$anon.p()
谁能解释为什么会这样?任何帮助将不胜感激!谢谢!
没有理由 def p
应该是 public。这是您在实现特征 A
的本地匿名 class 中定义的方法。 trait A
只声明了 public 方法 x
,没有别的。因此,您可以访问 p
的唯一范围是 new A { ... }
的初始化程序内部,因此 private
似乎适合于此。
如果你想公开方法p
,你可以将它添加到A
(然后你必须在那里实现它,然后你也不需要withPrint
方法),或者混合一个额外的特征来保证方法 p
的存在。例如:
trait A {
def x: Int
}
trait Print {
def p: Unit
}
case class Decorator(a: A) {
def withPrint: A with Print = new A with Print {
val x = 100
def p: Unit = println(x)
}
}
val a = new A { val x = 100 }
val d = Decorator(a).withPrint
d.p