Scala中具有协变类型参数和私有构造函数的类

存在

这是楼梯书的示例:

object Example {
  class Queue[+T] private (
                          private[this] var leading: List[T],
                          private [this] var trailing: List[T]
                            ) {
    private def mirror: Unit = {
      if(leading.isEmpty) {
        while(!trailing.isEmpty) {
          leading = trailing.head :: leading
          trailing = trailing.tail
        }
      }
    }

    // cannot resolve symbol U
    def this[U >: T](xs: U*) = this(xs.toList, Nil)
    // Covariant type T occurs in contra-variant position
    def this(xs: T*) = this(xs.toList, Nil)

    def head: T = {
      mirror
      leading.head
    }

    def tail: Queue[T] = {
      mirror
      new Queue(leading.tail, trailing)
    }

    def enqueue[U >: T](x: U) = new Queue[U](leading, x :: trailing)

    def size = leading.size + trailing.size
  }   
}

我添加了以下几行:

    // cannot resolve symbol U
    def this[U >: T](xs: U*) = this(xs.toList, Nil)
    // Covariant type T occurs in contra-variant position
    def this(xs: T*) = this(xs.toList, Nil)

因为我需要一些公共构造函数来创建新的队列。但是这些构造函数中的每一个都有其问题(请参阅注释)。如何解决这些问题?


更新

没有参数的构造函数似乎可以正常编译:

def this() = this(Nil, Nil)
奥利维尔·布兰维林

在Scala中,多个构造函数的首选替代方法是将一个伴随对象与apply方法配合使用:

object Queue {
  def apply[T, U <: T](xs: U*): Queue[T] = new Queue(xs.toList, Nil)
  def apply[T](xs: T*): Queue[T] = new Queue(xs.toList, Nil)
}

这样,您可以像使用Scala标准集合中的大多数数据结构一样,使用val q = Queue(1, 2, 3)实例化)来实例化队列new

我上面编写的对象不会按原样编译,因为擦除后这两个apply方法的类型相同,解决此问题的方式也不同,但是在这个精确的示例中,我认为最好简单地使用第二个函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Scala中具有私有构造函数和工厂的类?

如何限制案例类在Scala中具有特定的参数类型构造函数?

在带有协变类型的Scala参数化类内实现方法

Scala抽象类中的私有构造函数?

具有一个协变和一个协变参数的Bi-Functor型类的名称。

在Java中,如何使用私有构造函数创建一个类,而该私有构造函数的超类也具有私有构造函数?

协变类型参数可以在构造函数中的输入位置吗?

具有私有构造函数和析构函数的类对象的向量?

Java枚举和具有私有构造函数的类之间有什么区别?

Scala中具有两个参数的类型构造函数的函子实例

在Scala的构造函数中扩展具有隐式参数的类的惯用方式是什么?

具有构造函数参数的Scala中的Trait vs Abstract类

具有构造函数中泛型类型的Java类的Scala继承

Scala-泛型,协变类型和函数作为参数

如何使类的字段与构造函数中的参数具有相同的类型

抽象类可以在C ++ 11中具有构造函数和私有成员吗

创建具有私有构造函数的类模板的实例

具有私有构造函数的类的静态成员

具有私有构造函数和自身静态数组的类

在继承的类中具有参数的最佳实践构造函数

具有类型参数的派生构造函数

使类构造函数私有

在基类构造函数中使用抽象类作为参数,以在派生类中具有更多特定类型

在具有类型参数的函数中调用的类型类方法

在具有私有构造函数的类中初始化静态变量

具有私有构造函数的std :: map中的C ++ 11类作为Value

Java:使用类型参数访问私有构造函数

具有多重继承的C ++协变返回类型错误

具有协变返回类型的方法在VC ++上崩溃