簡體   English   中英

如何構建Scala mixin特性以將返回轉換為擴展類型?

[英]How to structure a Scala mixin trait to cast a return to an extended type?

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

> 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以太多OO方式考慮這個asInstanceOf ,並且對於Scala中特征的工作方式基本無知。 我該如何更改N及其子類型?

M.name構造並返回一個foo N.name您調用super.name 由於super.name是指M.namesuper.name也構造並返回一個foo 然后你拿那個foo並調用.asInstanceOf[bar] 但這沒有任何意義,因為你的代碼中沒有任何東西可以構建一個bar ,而且,當barfoofoo不一定是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM