Scala中的结构类型:在细化中使用抽象类型
发布时间:2020-12-16 19:15:54 所属栏目:安全 来源:网络整理
导读:说我有以下代码: 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,而
说我有以下代码:
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,而是想使用泛型类型B定义func,只要它具有正确签名的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |