2013-02-03 141 views
2

爲什麼不能使用類型別名來處理類型標籤。例如。鑑於類型別名擰緊類型標籤?

trait Foo 
object Bar { 
    def apply[A](implicit tpe: reflect.runtime.universe.TypeTag[A]): Bar[A] = ??? 
} 
trait Bar[A] 

我想下面的方法中使用別名,因爲我需要鍵入A圍繞兩個十幾次:

def test { 
    type A = Foo 
    implicit val fooTpe = reflect.runtime.universe.typeOf[A] // no funciona 
    Bar[A]             // no funciona 
} 

下一個嘗試:

def test { 
    type A = Foo 
    implicit val fooTpe = reflect.runtime.universe.typeOf[Foo] // ok 
    Bar[A]              // no funciona 
} 

所以似乎我根本無法使用我的別名。

回答

1

使用weakTypeOf代替。反思在內部區分了全局可見和局部的聲明,所以你需要以不同的方式對待它們。這個疣可能會在更高版本的Scala中被刪除。

+0

好的。但是,我是否也需要更改聲明網站?因爲我似乎沒有從由'weakTypeOf'返回到'TypeTag [A]'的類型進行隱式轉換。例如。 'found:reflect.runtime.universe.Type; required:reflect.runtime.universe.TypeTag [A]'(當調用Bar [A](fooTpe)') –

+0

好吧,好像我在從手機回答時忽略了一些東西。首先,'typeOf'和'weakTypeOf'的結果是一個'Type',而不是'TypeTag',所以'fooTpe'不適合'Bar.apply'。 –

+0

其次,您可以完全擺脫'weakTypeOf'並將'TypeTag [A]'改爲'WeakTypeTag [A]'。之後,它會正常工作。 –

0

更改def apply聲明:

import scala.reflect.runtime.universe._ 
trait Foo 
object Bar { 
    def apply[A]()(implicit tpe: TypeTag[A]): Bar[A] = ??? 
} 
trait Bar[A] 
class test { 
    type A = Foo 
    implicit val foo = typeOf[A] 
    def test = Bar[A]()             
} 
+0

「應用」無關緊要。你的例子似乎工作,因爲你將類型別名移動到**類成員級別**('def test'成爲'class test')。它似乎破壞作爲一種方法本地類型別名莫名其妙 - 很奇怪.... –