带有私有构造函数和隐式参数的Scala类

带有私有构造函数和隐式参数的Scala类,scala,constructor,implicits,Scala,Constructor,Implicits,我想向带有私有构造函数的类添加一个隐式参数。以下是一个简化示例: class A[T] private(a:Int){ def this()=this(0) } 如果我想将Pimp my library模式应用于带有有序[T]的T,我需要使用(不推荐使用的)视图绑定,如下所示: class A[T <% Ordered[T]] private(a:Int){ def this()=this(0) } 对于上述代码,编译器生成以下错误: error: No implicit

我想向带有私有构造函数的类添加一个隐式参数。以下是一个简化示例:

class A[T] private(a:Int){ 
  def this()=this(0)
}
如果我想将Pimp my library模式应用于带有有序[T]的T,我需要使用(不推荐使用的)视图绑定,如下所示:

class A[T <% Ordered[T]] private(a:Int){ 
  def this()=this(0)
}
对于上述代码,编译器生成以下错误:

error: No implicit view available from T => Ordered[T].
       def this()=this(0)
而如果我尝试像这样直接传递隐式参数:

class A[T] private(a:Int)(implicit conv:T=>Ordered[T]){ 
  def this()=this(0)(conv)
}
我明白了:

error: not found: value conv
       def this()=this(0)(conv)
在这种情况下,如何传递隐式参数


编辑:经过更多的实验,似乎用隐式参数重新定义构造函数是问题所在。并非构造函数是私有的。我找到了一个答案,似乎我需要为无参数构造函数显式定义隐式参数,例如:

class A[T] private(a:Int)(implicit conv:T=>Ordered[T]){ 
  def this()(implicit conv:T=>Ordered[T])=this(0)
}

我为垃圾邮件道歉,因此,无论如何,我都会接受任何提供更深入解释的答案。

我找到了答案,似乎我需要明确定义无参数构造函数的隐式参数,例如:

class A[T] private(a:Int)(implicit conv:T=>Ordered[T]){ 
  def this()(implicit conv:T=>Ordered[T])=this(0)
}

很抱歉我发了垃圾邮件,所以,无论如何,我都会接受任何提供更深入解释的答案。

Scala提供了两种风格的排序,一种是通过继承
Ordered
,另一种在这里更合适的是通过使用
ordering
类型类的上下文边界

您的方法实际上并不是惯用的,如果您有实际使用您提供的隐式的东西,您将在编译时得到一个不明确的隐式异常,因为构造函数和方法都定义了相同的隐式异常

我要做的是:

class A[T : Ordering] private(a: Int)
这实际上是以下内容的简写语法:

class A[T] private(a: Int)(implicit ev: Ordering[T])
然后可以显式或隐式地使用此参数。 如果使用速记
T:Ordering
语法定义它

class A[T : Ordering] private(a: Int) {
  def revSorter(list: List[T]): List[T] = {
    list.sorted(implicitly[Ordering[T]].reverse)
  }
}
如果使用“显式”语法定义它:


Scala提供了两种风格的排序,一种是通过继承
Ordered
,另一种在这里更合适的是通过上下文边界使用
ordering
typeclass

您的方法实际上并不是惯用的,如果您有实际使用您提供的隐式的东西,您将在编译时得到一个不明确的隐式异常,因为构造函数和方法都定义了相同的隐式异常

我要做的是:

class A[T : Ordering] private(a: Int)
这实际上是以下内容的简写语法:

class A[T] private(a: Int)(implicit ev: Ordering[T])
然后可以显式或隐式地使用此参数。 如果使用速记
T:Ordering
语法定义它

class A[T : Ordering] private(a: Int) {
  def revSorter(list: List[T]): List[T] = {
    list.sorted(implicitly[Ordering[T]].reverse)
  }
}
如果使用“显式”语法定义它:


你不需要道歉,回答你自己的问题是完全可以接受的。@Krle在我的书中,这是一个相当大的代码气味。正确地缩进代码是一个很好的开始,但我不会这么做。相反,我会将这个重载构造函数移动到一个具有相同隐式的伴生apply方法,它看起来稍微干净一些。@flavian谢谢,我会这样做的。你能详细解释一下原因吗?对于缩进和伴随对象……你不需要道歉,回答你自己的问题是完全可以接受的。@Krle在我的书中,这是一个相当大的代码气味。正确地缩进代码是一个很好的开始,但我不会这么做。相反,我会将这个重载构造函数移动到一个具有相同隐式的伴生apply方法,它看起来稍微干净一些。@flavian谢谢,我会这样做的。你能详细解释一下原因吗?对于缩进和伴随对象……是的,我同意上下文边界,但我想重点是关于如何用隐式参数重新定义构造函数。我应该在示例中使用泛型类B,而不是有序[T]。是的,我同意上下文边界,但我想重点是如何使用隐式参数重新定义构造函数。我应该在示例中使用泛型类B,而不是有序[T]。