2016-04-23 6 views
2

リフレクションを使用して2つのタイプ間の '互換性'を比較する際に問題があります(実際にはマクロを書きます)。たとえば、Vector[Int] === List[Int]を許可します。今私はgeneral approachを知っています。しかし問題は、この場合、型コンストラクタパラメータを取得できないことです。"洗練された"タイプのための適切な型のコンストラクタパラメータの取得

import scala.reflect._ 
import runtime.universe._ 

typeOf[List[Int]].typeArgs        // List(Int) OK 
typeOf[List[Int] with java.io.Serializable].typeArgs // List() FAIL 

なぜこの問題が発生しますか?

test(List(1, 2, 3), List(1, 2, 3)) // List(Int) 

をしかし、これはしていません::

def test[A, B >: A](a: A, b: B)(implicit tt: TypeTag[B]) = { 
    println(s"tt = $tt") 
    typeOf[B].typeArgs 
} 

は今、この作品

test(Vector(1, 2, 3), List(1, 2, 3)) // List() 

答えて

0

一つRefinedTypeと呼ば抽出使用することができます。そして、1はまだあり

def test[A, B >: A](a: A, b: B)(implicit tt: TypeTag[B]): List[List[Type]] = { 
    val all = typeOf[B] match { 
    case RefinedType(parents, scope) => parents.map(_.typeArgs) 
    case x => x.typeArgs :: Nil 
    } 
    all.filter(_.nonEmpty) 
} 

test(List(1, 2, 3), List(1, 2, 3)) 
test(Vector(1, 2, 3), List(1, 2, 3)) 

を何とかフィンに両親を揃える戦略。 (私は今すべての組み合わせをテストしています)。

関連する問題