gpt4 book ai didi

scala - Scala 中的结构类型 : use abstract type in refinement

转载 作者:行者123 更新时间:2023-12-04 12:47:43 27 4
gpt4 key购买 nike

假设我有以下代码:

class Bar { def bar(b:Bar):Boolean = true }
def func(b:Bar) = b.bar(b)

以上工作正常。类(class) Bar在第 3 方库中定义并且有几个类似的类,每个类都有一个 bar方法,例如
class Foo { def bar(f:Foo):Boolean = false }

而不是写 func对于每个这样的类,我想定义 func使用泛型 B只要它有 bar正确签名的方法。

我尝试了以下操作,但它给了我一个错误:
def func[B <: {def bar(a:B):Boolean}](b:B) = b.bar(b) // gives error

我得到的错误是:
<console>:16: error: Parameter type in structural refinement may not refer to 
an abstract type defined outside that refinement
def func[B <: {def bar(a:B):Boolean}](b:B) = b.bar(b)
^

但是,如果我执行以下操作,方法定义有效,但调用会出错:
def func[B <: {def bar(a:Any):Boolean}](b:B) = b.bar(b)

func(new Bar)

<console>:10: error: type mismatch;
found : Bar
required: B
func(new Bar)
^

有什么方法可以在不更改 Bar 的代码的情况下做我想做的事吗? ?

最佳答案

方法参数在结构类型之外定义的抽象类型已经足够了。其次,您的方法不起作用,因为方法签名不相等(看起来像方法重载)。

我建议使用解决方法。方法定义的函数方法,因为 Function1[-T1, +R] 是已知类型:

class Bar { def bar : Bar => Boolean = _ => true }
class Foo { def bar : Foo => Boolean = _ => false }

def func[T <: { def bar : T => Boolean } ](b: T): Boolean = b.bar(b)

func(new Bar)
func(new Foo)

缺点和优点 功能型 VS 方法类型 定义 here

关于scala - Scala 中的结构类型 : use abstract type in refinement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22959010/

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