【问题标题】:How to structure a Scala mixin trait to cast a return to an extended type?如何构造 Scala mixin 特征以将返回值转换为扩展类型?
【发布时间】:2012-05-23 20:52:08
【问题描述】:

我想混合一个特征,以便我可以使用方法 from 返回我自己的特征类型。例如,

> 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...

我知道我通过使用asInstanceOf 以一种面向对象的方式思考这个问题,并且对于 Scala 中特征工作方式的一些基本知识一无所知。我应该如何更改 N 及其子类型?

【问题讨论】:

    标签: scala type-conversion mixins


    【解决方案1】:

    M.name 构造并返回一个foo。在N.name 中,您调用super.name。由于super.name 引用M.namesuper.name 也构造并返回foo。然后你拿着foo 打电话给.asInstanceOf[bar]。但这没有任何意义,因为您的代码中没有任何内容构造过 bar,并且虽然 barfoo,但 foo 不一定是 bar

    如果您真的希望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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多