是否可以创建一个可以用作T [A,B]的泛型类型T [A <:C [U],B <:C [U],U]?

rig*_*old 5 generics scala

我有以下案例类:

case class <*>[Q <: Quantity[T], R <: Quantity[T], T](value: T) 
  extends Quantity[T]
Run Code Online (Sandbox Code Playgroud)

我想这样使用它:

type Area[T] = Length[T] <*> Length[T]
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个错误,说<*>预期有三个参数,我只给了两个.我希望它能像这样工作:

type Area[T] = <*>[Length[T], Length[T], T]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下但它给了我一个错误:

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]
Run Code Online (Sandbox Code Playgroud)

错误:(13,110)非法继承;
selftype <*>[Q,R]不符合Quantity[_$1]的selftypeQuantity[_$1]

case class <*>[Q <: Quantity[_],
               R <: Quantity[_]](value: Q#Value)
                                (implicit eq: Q#Value =:= R#Value)
  extends Quantity[Q#Value]
  ^
Run Code Online (Sandbox Code Playgroud)

这有解决方法吗?我不介意在必要时重命名案例类,虽然我确实需要漂亮的中缀语法.

lmm*_*lmm 1

问题在于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])
Run Code Online (Sandbox Code Playgroud)

then<*>是所需的双参数类型,但您只能Q <*> R使用适当相关的Q和进行实例化(因为隐式s 仅适用于合适的和)。RCanStar[Q, R]QR