Sha*_*yUT 3 parameters methods extends scala match
我对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) {} }
Run Code Online (Sandbox Code Playgroud)
为什么FooImpl与Foo不匹配,因为Foo是一个特质?我猜我需要改变Bar中someMethod的签名,说我期待扩展Foo或"with Foo"的东西,但我似乎无法找到这方面的文档.
问题是Bar特征的someMethod声明指定任何类型的Foo都可以作为参数传递.您可以将此视为"合同".合同说任何实施Bar都会有一种someMethod接受任何形式的方法Foo.
您的BarImpl类是一个实现Bar并具有someMethod实现.不幸的是,它的实现someMethod 只接受FooImpl各种Foo对象:不是任何一种Foo.由于它不允许您传入Foo非FooImpl对象的对象,因此它违反了特征定义指定的合同.实施不能比合同规定更严格.
举个例子:
class FooImplB extends Foo
val bar: Bar = new BarImpl
val foo: Foo = new FooImplB
bar.someMethod(foo)
Run Code Online (Sandbox Code Playgroud)
这里我们声明一个Bar被叫bar和一个Foo被叫foo.根据Foo我的定义我应该可以foo传入bar.someMethod.除BarImpl.someMethod只接受FooImpl各类Foo秒且不FooImplB小号!所以我们遇到了问题.