gpt4 book ai didi

使用隐式输入的 Scala 会导致输入错误

转载 作者:行者123 更新时间:2023-12-04 05:28:06 24 4
gpt4 key购买 nike

我正在尝试实现这一点:

def buildQuery() {
val restrictions: ConjunctionRestriction[String, Int] =
("name" is "Some One") and ("age" is 20)
}

implicit def stringToEqualsRestrictionBuilder[T](fieldName: String)
: EqualsRestrictionBuilder[T] =
new EqualsRestrictionBuilder[T](fieldName)

implicit def restrictionToConjunctionBuilder[L,R](restriction: Restriction[L])
: ConjunctionBuilder[L,R] =
new ConjunctionBuilder[L,R](restriction)

case class Restrictions(restrictions: Restriction[_]*)

trait Restriction[T] {
def toString: String
}

class EqualsRestriction[T](val fieldName: String, val value: T)
extends Restriction[T] {
override def toString = fieldName + "=" + value
}

class ConjunctionRestriction[A,B](val lhs: Restriction[A],
val rhs: Restriction[B])
extends Restriction[(A,B)] {
override def toString = "(" + lhs + ") AND (" + rhs + ")"
}

class EqualsRestrictionBuilder[T](val fieldName: String,
val restriction: Option[Restriction[T]] = None) {

def is(value: Int) =
new EqualsRestriction[Int](fieldName, value)

def is(value: String) =
new EqualsRestriction[String](fieldName, "\"" + value + "\"")
}

class ConjunctionBuilder[L,R](val lhs: Restriction[L]) {
def and(rhs: Restriction[R]) = new ConjunctionRestriction[L,R](lhs, rhs)
}

编译器给我错误:
error: type mismatch;
found : MyOuterClass.this.EqualsRestriction[Int]
required: MyOuterClass.this.Restriction[R]
val restrictions: ConjunctionRestriction[String, Int] =
("name" is "Some One") and ("age" is 20)

我还没有弄清楚 scala 类型系统。这有什么问题?

谢谢

编辑

通过将 ConjunctionBuilder 更改为只有一种参数类型 L 来修复:
class ConjunctionBuilder[L](val lhs: Restriction[L]) {
def and[R](rhs: Restriction[R]) = new ConjunctionRestriction[L,R](lhs, rhs)
}

implicit def restrictionToConjunctionBuilder[L](restriction: Restriction[L])
: ConjunctionBuilder[L] =
new ConjunctionBuilder[L](restriction)

但是有人可以解释为什么使用 R 参数类型编译失败吗?

最佳答案

ConjunctionBuilder 时失败有R类型参数只是因为在应用隐式转换时 restrictionToConjunctionBuilder , 编译器只能推断 L (来自参数 restriction )。
类型参数R没有出现在参数列表的任何地方,因此无法推断。
当无法推断类型参数时,您必须显式传递它们(当然,在隐式转换的情况下,这违背了目的)。
例如:以下编译正确:

val restrictions: ConjunctionRestriction[String, Int] =
(("name" is "Some One"): ConjunctionBuilder[String, Int]) and ("age" is 20)

没有明确指定类型参数,编译器无法绑定(bind) R ,因此无法证明方法 and 的参数是正确的类型。
实际上,该方法需要 Restriction[R] , 我们给它一个 Restriction[Int] .这只能匹配 R == Int ,编译器无法证明为 R是未绑定(bind)的。

您的修复完全正确:移动类型参数 Rand 的定义.这种方式在应用隐式转换时 restrictionToConjunctionBuilder , 编译器可以从参数 L 中完全推断出所有类型参数(即 uniqye 类型参数 restriction ) .
那么在申请 and的时候它可以推断 R从它的参数 rhs

关于使用隐式输入的 Scala 会导致输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12948477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com