2

型パラメーターを含むサブクラスを実装し、引数がパラメーターに準拠しているかどうかに応じて異なる動作をする関数の実装を記述したいと考えています。

検討:

import scala.reflect.runtime.universe;

trait Lover {
    def love( amour : Any ) : String
}

class TypedLover[MY_TYPE]( implicit val myTypeTag : universe.TypeTag[MY_TYPE] ) extends Lover {
    def love( amour : Any ) : String =
        if ( ??? ) "You are totally my type." else "Nope, sorry, not my type."
}

ここで条件に何を使用しますか? [更新:関数の引数amourが MY_TYPE に準拠している場合、条件は true を返し、そうでない場合は false を返す必要があります。]

助けてくれてありがとう。

4

4 に答える 4

3
class TypedLover[A](implicit tt: TypeTag[A]) extends Lover {
  def love(amour: Any) =
    if (tt.tpe =:= typeOf[String]) "You are totally my type."
    else "Nope, sorry, not my type."
}

scala> new TypedLover[String].love(null)
res2: String = You are totally my type.

scala> new TypedLover[Int].love(null)
res3: String = Nope, sorry, not my type.

動作の詳細については、次のTypeTag質問を参照してください。Scala:TypeTagとは何ですか、またどのように使用しますか?

于 2013-03-07T06:02:57.327 に答える
2

私はあなたがこのようなものが欲しいと思います:

trait Lover {
  def love( amour : Any ) : String
}

class TypedLover[A : ClassTag] extends Lover {
    def love(amour : Any) = {
        if (implicitly[ClassTag[A]].runtimeClass == amour.getClass) {
                "Totally my type."
            } else {
                "Sorry, you are not my type."
            }
    }
}

val tl = new TypedLover[String]
tl.love(1) // res0: String = Sorry, you are not my type.
tl.love("Hello") //res1: String = Totally my type.

サブタイピングをキャプチャしたい場合isAssignableFromは、 in のようなメソッドを使用できることに注意してください。==

于 2013-03-07T10:13:28.133 に答える
0

これは私ができる最高のものです。それは私が望む真のランタイム型情報をキャプチャしませんが、コンパイル時に少なくとも使用時点で既知の型情報をキャプチャします:

import scala.reflect.runtime.universe._

trait Lover {
  def love[ T : TypeTag ]( amour : T ) : String;
}

class TypedLover[MY_TYPE : TypeTag] {
  def love[ T : TypeTag ]( amour : T ) : String =
    if ( implicitly[TypeTag[T]].tpe <:< implicitly[TypeTag[MY_TYPE]].tpe )
      "You are totally my type."
    else
      "Nope, sorry, not my type."
}

仕組みは次のとおりです。

scala> val intLover = new TypedLover[Int]
intLover: TypedLover[Int] = TypedLover@2d4cadc4

scala> intLover.love(7)
res2: String = You are totally my type.

scala> intLover.love("Hello")
res3: String = Nope, sorry, not my type.

scala> val stringLover = new TypedLover[String]
stringLover: TypedLover[String] = TypedLover@1f7c9157

scala> stringLover.love(7)
res4: String = Nope, sorry, not my type.

scala> stringLover.love("Hello")
res5: String = You are totally my type.

ただし、実際のランタイム型情報を取得できない理由は次のとおりです。

scala> val stringInAnyRef : Any = "Hello"
stringInAnyRef: Any = Hello

scala> stringLover.love( stringInAnyRef )
res7: String = Nope, sorry, not my type.

完璧ではありませんが、これまでで最高です。

于 2013-03-26T03:04:03.297 に答える
0

Scala には、Manifestクラスを使用して型消去を回避する方法があります。使用法を示す私の要点へのリンク - https://gist.github.com/anoopelias/4462155

于 2013-03-07T04:56:13.017 に答える