如何构造Scala mixin特征以强制转换为扩展类型的返回?

如何构造Scala mixin特征以强制转换为扩展类型的返回?,scala,type-conversion,mixins,Scala,Type Conversion,Mixins,我想混合一个trait,这样我就可以使用一个来自的方法来返回我自己的trait类型。比如说, > trait M { trait foo {def blah = "foo" } def name:foo = { new foo { override def blah = "name"}}} > trait N extends M { trait bar extends foo {} override def name:bar = super.nam

我想混合一个trait,这样我就可以使用一个来自的方法来返回我自己的trait类型。比如说,

> trait M { 
    trait foo {def blah = "foo" }
    def name:foo = { new foo { override def blah = "name"}}}
> trait N extends M { 
    trait bar extends foo {}
    override def name:bar = super.name.asInstanceOf[bar]}
> object t extends N { val baz = name }
> t.name
  java.lang.ClassCastException: M$$anon$1 cannot be cast to N$bar
at N$class.name(<console>:7)
at t$.name(<console>:8)
at t$.<init>(<console>:8)
at t$.<clinit>(<console>)
at .<init>(<console>:10)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:9)
at RequestResult$.<clinit>(<console>)
at RequestResult$scala_repl_result(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$17.apply(Interpreter.scala:988)
at scala.tools.nsc.Interpreter$Request$$anonfun$l...
>trait M{
trait foo{def blah=“foo”}
def name:foo={new foo{override def blah=“name”}}
>特征N扩展M{
特征条扩展foo{}
覆盖def name:bar=super.name.asInstanceOf[bar]}
>对象t扩展N{val baz=name}
>t.name
java.lang.ClassCastException:M$$anon$1不能强制转换为N$bar
在N$class.name(:7)
在t$.name(:8)
按新台币计算(:8)
新台币()
在。(:10)
在
请求时结果$。(:9)
请求时结果$()
请求时结果$scala_repl_result()
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:616)
在scala.tools.nsc.transparer$Request$$anonfun$loadand run$1$$anonfun$apply$17.apply(transparer.scala:988)
在scala.tools.nsc.translator$Request$$anonfun$l。。。

我知道,我用
作为
的替代品,以一种面向对象的方式来思考这个问题,我对Scala中特性的基本工作方式一无所知。如何更改N及其子类型?

M.name
构造并返回一个
foo
。在
N.name
中调用
super.name
。由于
super.name
引用
M.name
super.name
还构造并返回
foo
。然后,您使用
foo
并调用
.asInstanceOf[bar]
。但这没有意义,因为代码中没有任何东西构建过
,而
foo
,而
foo
不一定是

如果确实希望
N.name
返回
bar
,则需要重写
M.name
,以便显式构造
bar
,并返回它

trait N extends M {
  trait bar extends foo {}
  override def name: bar ={
    val f: foo = super.name                // not what we want; it's not a `bar`
    new bar { override def blah = f.blah } // this is actually a `bar`
  }
}
现在我们得到:

scala> println(t.name.blah)
name