如何访问类参数?

c9qzyr3d  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(227)

根据《scala编程》,第304页

class Queue[T] private (leading: List[T], trailing: List[T]){
  private def mirror =
    if(leading.isEmpty) new Queue(trailing.reverse, Nil)
    else this
  def head = mirror.leading.head
  def tail = {
    val q = mirror
    new Queue(q.leading.tail, q.trailing)
  }
  def append[T](x: T)={
    new Queue(leading, x::trailing)
  }
}

我得到以下错误

Error:value leading is not a member of Queue[T]
def head = mirror.leading.head

相同的错误 trailing . mirror 是类的对象 Queue 正确的?为什么它不能访问它的类参数?

x6h2sr28

x6h2sr281#

的确 leading 以及 trailingQueue 类,但默认情况下它们是私有的。把它们公之于众 val 注解:
之前:

scala> class Queue[T] private (leading: List[T], trailing: List[T]){
     |   private def mirror =
     |     if(leading.isEmpty) new Queue(trailing.reverse, Nil)
     |     else this
     |   def head = mirror.leading.head
     |   def tail = {
     |     val q = mirror
     |     new Queue(q.leading.tail, q.trailing)
     |   }
     |   def append[T](x: T)={
     |     new Queue(leading, x::trailing)
     |   }
     | }
<console>:15: error: value leading is not a member of Queue[T]
         def head = mirror.leading.head
                           ^
<console>:18: error: value leading is not a member of Queue[T]
           new Queue(q.leading.tail, q.trailing)
                       ^
<console>:18: error: value trailing is not a member of Queue[T]
           new Queue(q.leading.tail, q.trailing)
                                       ^

之后:

scala> class Queue[T] private (val leading: List[T], val trailing: List[T]){
     |   private def mirror =
     |     if(leading.isEmpty) new Queue(trailing.reverse, Nil)
     |     else this
     |   def head = mirror.leading.head
     |   def tail = {
     |     val q = mirror
     |     new Queue(q.leading.tail, q.trailing)
     |   }
     |   def append[T](x: T)={
     |     new Queue(leading, x::trailing)
     |   }
     | }
defined class Queue

您可以在这里详细了解构造函数和getter。相关要点是:
参数无 val 或者 var 是私有值,仅在类中可见。

相关问题