我在乘法函数中找到一个“参数类型不匹配”错误,并且不知道如何修复它。任何帮助欢迎。谢谢。代码是:
abstract class Semigroup<T1> {
abstract val one : SemigroupElement<T1>
abstract fun builder(x: T1): SemigroupElement<T1>
abstract val binOp: (SemigroupElement<T1>, SemigroupElement<T1>) -> SemigroupElement<T1>
abstract inner class SemigroupElement<T1> {
fun multiply(other: SemigroupElement<T1>) = binOp(this, other) // Argument type mismatch
abstract val value: T1
}
}
当您将所有类型的参数命名时(
T1
)时,它变得混乱。
LLET的第一个重命名类的类型参数Semigroup
从
T1
到
T
以及类的类型参数从
SemigroupElement
到
T1
。然后您有以下代码:
E
现在很清楚为什么这是不起作用的:摘要
abstract class Semigroup<T> {
abstract val one : SemigroupElement<T>
abstract fun builder(x: T): SemigroupElement<T>
abstract val binOp: (SemigroupElement<T>, SemigroupElement<T>) -> SemigroupElement<T>
abstract inner class SemigroupElement<E> {
fun multiply(other: SemigroupElement<E>) = binOp(this, other) // Argument type mismatch
abstract val value: E
}
}
需要两个
binOp
,但是您为其提供了两个
SemigroupElement<T>
。由于SemigroupElement<E>
和T
在任何方面都不相关,因此编译器抗议的错误“ type不匹配”。
尚不清楚您想实现的目标,但看起来您甚至根本不需要类型参数。由于SemigroupElement是(外部)类半群的Inner1类,因此只能在半群的实例中存在。因此,您可以访问Outer类'类型参数
E
,然后让SemigroupElement
为该类型:
T
1:不是您的问题标题所暗示的;嵌套类不会具有
value
修饰符,即使没有外部类的实例,也允许它的实例。在这里,您有一个Inner类,而不是一个nested