使用类型构造函数扩展 class
Extending a class with a type constructor
我正在尝试使用单个 [A] 类型参数扩展基础 class,使用具有 A[_] 类型参数的 subclass - 如下所示:
abstract class IsBase[A]
abstract class IsSub[A[_]] extends IsBase[A[_]] {
type T
def get(self: A[T]): T
}
implicit def listIsSub[_T] = new IsSub[List] {
type T = _T;
def get(self: List[T]): T = self(0)
}
val list = List(1, 2)
implicitly[IsSub[List]{ type T = Int }].get(list) // works fine
implicitly[IsBase[List[Int]]] // Could not find implicit value for parameter e
我知道这样做的一种方法就是将抽象类型 T 向上移动到类型参数,就像这样:
abstract class IsSub1[A[_], T] extends IsBase[A[T]]
但在我继续这条路线之前,我想检查一下是否没有一种直接的方法可以按原样进行。
谢谢!
您应该尝试的 the first things 之一是手动解析隐式,看看会发生什么
implicitly[IsBase[List[Int]]](listIsSub[Int])
//type mismatch;
// found : App.IsSub[List]{type T = Int}
// required: App.IsBase[List[Int]]
//Note: List[_] >: List[Int]
// (and App.IsSub[List]{type T = Int} <: App.IsBase[List[_]]),
// but class IsBase is invariant in type A.
//You may wish to define A as -A instead. (SLS 4.5)
所以你可以看到你只是没有定义必要的隐式。您定义了类型 IsSub[List]{type T = Int}
的隐式,它未连接到 IsBase[List[Int]]
,因为 IsSub
(使用 type-constructor 类型参数 A[_]
)扩展了 IsBase[A[_]]
存在类型参数。存在主义(和类型预测)rarely 与隐式配合得很好。
可以看到提示。你可以使IsBase
逆变
abstract class IsBase[-A]
然后
implicitly[IsBase[List[Int]]]
编译。
我正在尝试使用单个 [A] 类型参数扩展基础 class,使用具有 A[_] 类型参数的 subclass - 如下所示:
abstract class IsBase[A]
abstract class IsSub[A[_]] extends IsBase[A[_]] {
type T
def get(self: A[T]): T
}
implicit def listIsSub[_T] = new IsSub[List] {
type T = _T;
def get(self: List[T]): T = self(0)
}
val list = List(1, 2)
implicitly[IsSub[List]{ type T = Int }].get(list) // works fine
implicitly[IsBase[List[Int]]] // Could not find implicit value for parameter e
我知道这样做的一种方法就是将抽象类型 T 向上移动到类型参数,就像这样:
abstract class IsSub1[A[_], T] extends IsBase[A[T]]
但在我继续这条路线之前,我想检查一下是否没有一种直接的方法可以按原样进行。
谢谢!
您应该尝试的 the first things 之一是手动解析隐式,看看会发生什么
implicitly[IsBase[List[Int]]](listIsSub[Int])
//type mismatch;
// found : App.IsSub[List]{type T = Int}
// required: App.IsBase[List[Int]]
//Note: List[_] >: List[Int]
// (and App.IsSub[List]{type T = Int} <: App.IsBase[List[_]]),
// but class IsBase is invariant in type A.
//You may wish to define A as -A instead. (SLS 4.5)
所以你可以看到你只是没有定义必要的隐式。您定义了类型 IsSub[List]{type T = Int}
的隐式,它未连接到 IsBase[List[Int]]
,因为 IsSub
(使用 type-constructor 类型参数 A[_]
)扩展了 IsBase[A[_]]
存在类型参数。存在主义(和类型预测)rarely 与隐式配合得很好。
可以看到提示。你可以使IsBase
逆变
abstract class IsBase[-A]
然后
implicitly[IsBase[List[Int]]]
编译。