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

在Scala中键入类模式不考虑继承?

发布时间:2020-12-16 18:57:05 所属栏目:安全 来源:网络整理
导读:我在某些情况下使用类型类设计一个API,但是我遇到了隐式解析的问题.如下所示,如果存在类型A的隐式对象,但是类型B扩展A的对象传递给方法,则无法找到隐式对象.有没有办法使这个工作或者调用者必须将隐式对象放入每个子类的范围? 这是一个例子: class Aclass
我在某些情况下使用类型类设计一个API,但是我遇到了隐式解析的问题.如下所示,如果存在类型A的隐式对象,但是类型B扩展A的对象传递给方法,则无法找到隐式对象.有没有办法使这个工作或者调用者必须将隐式对象放入每个子类的范围?

这是一个例子:

class A
class B extends A

class T[+X]

object T {
  implicit object TA extends T[A]
}

def call[X:T](x:X) = println(x)

// compiles
call(new A)
// doesn't compile
call(new B)

var a = new A
// compiles
call(a)

a = new B
// compiles
call(a)

val b = new B
// doesn't compile
call(b)

无法使用以下输出进行编译:

/private/tmp/tc.scala:16: error: could not find implicit value for evidence parameter of type this.T[this.B]
call(new B)
    ^
/private/tmp/tc.scala:28: error: could not find implicit value for evidence parameter of type this.T[this.B]
call(b)

解决方法

呼叫(新B)意味着呼叫[B](新B)(tB),使得tb是类型T [B]或其子类. (预期类型T的参数的方法只能期望T或T的子类,例如,def foo(s:String)不能使用类型为Any的参数来调用). T [A]不是T [B]的子类型

要修复,可以将T更改为T [-X].这意味着编译器会将T [A]视为T [B]的子类型,

(编辑:李大同)

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

    推荐文章
      热点阅读