加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读