我有以下案例类:
case class <*>[Q <: Quantity[T], R <: Quantity[T], T](value: T)
extends Quantity[T]
我想这样使用它:
type Area[T] = Length[T] <*> Length[T]
但是,我收到一条错误消息,说
<*>
需要三个参数,而我只给出了两个。我希望它像这样工作:type Area[T] = <*>[Length[T], Length[T], T]
我尝试了以下但它给了我一个错误:
trait Quantity[T] {
type Value = T
def value: T
}
case class <*>[Q <: Quantity[_],
R <: Quantity[_]](value: Q#Value)
(implicit eq: Q#Value =:= R#Value)
extends Quantity[Q#Value]
Error:(13, 110) illegal inheritance;
self-type<*>[Q,R]
does not conform toQuantity[_$1]
's selftypeQuantity[_$1]
case class <*>[Q <: Quantity[_], R <: Quantity[_]](value: Q#Value) (implicit eq: Q#Value =:= R#Value) extends Quantity[Q#Value] ^
有解决方法吗?我不介意在必要时重命名 case 类,尽管我确实想要漂亮的中缀语法。
最佳答案
问题是 Q#Value
引用。
我建议使用隐式来强制您的类型约束,而不是试图使存在性工作:
sealed trait CanStar[Q, R]
// could include =:=-like values in CanStar if you like
object CanStar {
implicit def canStar[Q <: Quantity[T], R <: Quantity[T], T] =
new CanStar[Q, R]{}
}
sealed case class <*>[Q,R](value: Q)(implicit cs: CanStar[Q, R])
然后
<*>
是需要的两个参数类型,但您只能实例化 Q <*> R
与 Q
和 R
适当相关(因为隐式 CanStar[Q, R]
仅适用于合适的 Q
和 R
)。
关于scala - 是否可以创建可用作 T[A, B] 的泛型类型 T[A < : C[U], B < : C[U], U]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717566/