0

このコードが優れたプログラミング手法であると主張しているわけではありませんが、コンパイルできない理由がわかりません。何が起きてる?

object CustomTo extends App {
  val thing:Something = new Something
  val str:String = thing.to[String]
  println(str)
}

class Something {
  def to[String]:String = {
    "hello"
  }
}

コンパイラ出力:

CustomTo.scala:9: error: type mismatch;
 found   : java.lang.String("hello")
 required: String
    "hello"
    ^
one error found
4

2 に答える 2

1

Stringの代わりに型パラメーターに名前を付けましTたが、それによって抽象度が低下するわけではなく、何でもかまいません。

def to[String]:String 
// is the same as
def to[T]:T

.to[T]で呼び出されたときに hello を返すジェネリック関数を作成する場合String、つまり、型でパターン マッチを行いたい場合は、 を使用できます TypeTag

編集:戻り値の型が である必要があることを見逃していましたT。つまり、役に立たないキャストが必要です。以下を参照してください。

import reflect.runtime.universe._

def to[T : TypeTag] = (typeOf[T] match {
  case t if t =:= typeOf[String] => "hello"
  case t if t =:= typeOf[Int] => 1
  case _ => ???
}).asInstanceOf[T]

と:

scala> to[String]
res13: String = hello

scala> to[Int]
res14: Int = 1

scala> to[Double]
scala.NotImplementedError: an implementation is missing
...

パターンマッチ内のものが正しい型を持っていることをコンパイラーに独自に推測させる方法があるかどうかはわかりません。で可能かもしれませんが、 と同様ClassTagのタイプの安全性が失われ.to[List[Int]]ます...

于 2013-06-20T15:28:23.540 に答える