3

呼び出されたメソッドのパラメーターで使用される型パラメーターでTypeTagsのみ機能し、戻り値の型では機能しないようです。

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scala.reflect.runtime.universe._

object Test {
  def withParam[T: TypeTag](v: T): T = {
    println(typeOf[T])
    0.asInstanceOf[T]
  }

  def justReturn[T: TypeTag](): T = {
    println(typeOf[T])
    0.asInstanceOf[T]
  }
}

// Exiting paste mode, now interpreting.

import scala.reflect.runtime.universe._
defined module Test


scala> val i: Int = Test.withParam(17)
Int
i: Int = 0

scala> val j: Int = Test.justReturn()
Nothing
j: Int = 0

これは 2.9 のマニフェストの動作と一致していますが、実行できない理由はありますか? また、この効果を達成する他の方法はありますか?

4

2 に答える 2

2

型システムは、最も制限の厳しい型から始まります(つまりNothing、インスタンスはあり得ません。もしあれば、何かの代わりになり、何でもできる神のような価値があります)。その後、タイプは必要に応じて拡大されますが、リターンは反変の位置にあるため、拡大する理由はありません。実際にを返すことができればNothing、すべての状況で設定されます。

0次に、それがのインスタンスであることを伝えることにより、型システムを破壊しますNothing。もちろん、それは完全に誤りですが、コンパイラーはあなたを忠実に信じており、あなたはそれをに割り当てることによって状況を救い出しますInt。(また、喜んでそれをに割り当てようとしStringます。その時点では無意味であるため、実行時に例外が発生します。)

理論的にはこれは別の方法で行うことができますが、これは型推論アルゴリズムのかなり基本的な部分です。

于 2013-02-16T19:25:55.627 に答える
2

TRex Kerr のコメントを拡張すると、このケースでは推論を駆動するものは何もありませんjustReturn。(適切な) 型パラメーターを指定すると、次のようになります。

scala> val j: Int = Test.justReturn[Int]()
Int
j: Int = 0

これに変更justReturnすると:

def justReturn[T: TypeTag]() {
  println(typeOf[T])
}

...次に、これを行うことができます:

scala> justReturn[String]()
String

scala> justReturn[java.io.File]()
java.io.File
于 2013-02-16T19:21:29.143 に答える