Scala中的结构类型:在细化中使用抽象类型

时间:2014-04-09 09:57:37

标签: scala structural-typing

说我有以下代码:

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

以上工作正常。类Bar在第三方库中定义,并且有几个类似的类,每个类都有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代码的情况下做我想做的事情?

1 个答案:

答案 0 :(得分:2)

对于方法参数,在结构类型外定义的抽象类型应该知道问题。其次你的方法不起作用,因为方法签名不相等(看起来像方法重载)。

我建议使用变通方法。方法定义的功能方法,因为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) 

缺点&amp;优点功能类型 VS 方法类型定义here