带有私有构造函数和隐式参数的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]。