gpt4 book ai didi

scala - 使用预期类型的​​子参数实现 trait 方法

转载 作者:行者123 更新时间:2023-12-01 08:35:11 24 4
gpt4 key购买 nike

我对 Scala 很陌生,如果这是一个非常简单的问题,请原谅我,但我找不到任何可以帮助我的东西,或者我找不到正确的搜索词。我怎样才能做到这一点?

scala> trait Foo
defined trait Foo

scala> class FooImpl extends Foo
defined class FooImpl

scala> trait Bar { def someMethod(foo: Foo) }
defined trait Bar

scala> class BarImpl extends Bar { def someMethod(foo: FooImpl) {} }
<console>:10: error: class BarImpl needs to be abstract, since method someMethod in trait Bar of type (foo: Foo)Unit is not defined
(Note that Foo does not match FooImpl)
class BarImpl extends Bar { def someMethod(foo: FooImpl) {} }

既然 Foo 是一个特征,为什么 FooImpl 不匹配 Foo?我猜我需要在 Bar 中更改 someMethod 的签名,以说明我期待扩展 Foo 或“with Foo”的东西,但我似乎找不到这方面的文档。

最佳答案

问题在于 Bar trait 的 someMethod 声明指定任何类型的 Foo 都可以作为参数传递。你可以把它想象成它的“契约”。契约(Contract)规定 Bar 的任何实现都将有一个方法 someMethod 可以接受任何类型的 Foo

您的 BarImpl 类是 Bar 的实现,并且具有 someMethod 实现。不幸的是,它的 someMethod only 实现接受 FooImpl 种类的 Foo 对象:不是 any 一种Foo。由于它不允许您传入不是 FooImpl 对象的 Foo 对象,因此它违反了 trait 定义指定的契约。实现不能比契约(Contract)规定的限制更多。

举个例子:

class FooImplB extends Foo
val bar: Bar = new BarImpl
val foo: Foo = new FooImplB
bar.someMethod(foo)

这里我们声明了一个名为 barBar 和一个名为 fooFoo。根据 Foo 的定义,我应该能够将 foo 传递给 bar.someMethod。除了 BarImpl.someMethod 只接受 FooImpl 种类的 Foo 而不是 FooImplB!所以我们有一个问题。

关于scala - 使用预期类型的​​子参数实现 trait 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123785/

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