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

标签 scala generics

我有以下案例类:

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 to Quantity[_$1]'s selftype Quantity[_$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 <*> RQR适当相关(因为隐式 CanStar[Q, R] 仅适用于合适的 QR )。

关于scala - 是否可以创建可用作 T[A, B] 的泛型类型 T[A < : C[U], B < : C[U], U]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717566/

相关文章:

scala - (run-main-0) java.lang.NoSuchMethodError

java - Eclipse 告诉我 Long 不可比较

c# - 在可扩展工厂中使用泛型?

java - 花哨的泛型捕获碰撞

java - 使用 java -jar 运行 scala 应用程序

scala - HList/KList 是否适合作为方法参数?如何引用?类型列表?

scala - 在 Scala 3 中,为什么有时可以进行谓式类型赋值?

c# - 有没有办法单独而不是联合应用 c# 泛型约束?

c# - 参数类型不可分配给参数类型,它应该是

Scala ~>(波形符大于)运算符