我想動態插入一個類型參數,即List[T]
,其中T只能在運行時找到。使用scala Type來設置類型參數(通過TypeTag?)
通常情況下,如果您已有現有類型參數T
(不是這種情況),或者在運行期間使用TypeTag
s,則可以創建類似於此的綁定。
後者聽起來像是要走的路,但是這會將問題轉移到「我如何讓我的TypeTag在這裏」。
我知道如何使用創建TypeTag,如果你有你的類型T
(typeTag[T]
),或者如果你有你的T
類型的實例(見下文getTypeTag
)。
但是,我沒有;我所遇到的類型是reflect.runtime.universe.Type
。可能將其轉換爲TypeTag
,這樣我可以動態插入我的類型參數?
獎勵積分如果List
也可以動態。
scala> import scala.reflect.runtime.{universe => ru}
scala> def getTypeTag[T: ru.TypeTag](obj: T) = ru.typeTag[T]
scala> def insertTag[T](tt: ru.TypeTag[T]) = List[T]_
scala> val fn = (a: String) => "foo"
fn: String => String = <function1>
scala> val pars = getTypeTag(fn).tpe.typeArgs.init(0)
pars: reflect.runtime.universe.Type = String
scala> insertTag(pars)
<console>:21: error: type mismatch;
found : reflect.runtime.universe.Type
required: reflect.runtime.universe.TypeTag[?]
insertTag(pars)
^
我不知道我明白了什麼是'insertTag(標準桿)'預期的結果。你總是希望'fn'只有一個參數,還是可以有多個參數?那麼預期的結果是什麼? – Mifeet
好問題,猜猜這些都是我一直試圖簡化的東西。實際上,我實際上爲'fn.tupled'獲取'TypeTag',它處理多個參數。 實際上,輸出不是'List [T]',而是一個'akka.stream.scaladsl.Flow [T]',這與'List [T]'不同,這很有用(因此我必須添加' _',沒有它就沒有什麼和錯誤)。 如果你放入一個實際的TypeTag(即insertTag(ru.typeTag [Integer])'),那麼'insertTag'函數可以工作,但現在只需要一個'Type'就可以通過...... – Tycho