2011-11-17 31 views
3

我有這樣的事情:如何校驗值可視類型

def my_check[T](arg: T) = arg match { 
    case x: GenTraversable[_] = ... // XX 
    case x: Array[_] 
    ... 

我要合併一些cases表達:
在上面的代碼打上XX,我要檢查,如果arg <: GenTraversable[_]arg <% GenTraversable[-]。例如,Array類型可能也符合這種情況下(存在從ArrayWrapperArray <: GenTraversable隱式轉換)

我不想在解決方案中使用的例外,所以我不感興趣的東西,如:

try: 
    val trv: GenTraversable = arg 
catch ... 

我試過在my_check功能類似

T <:< GenTraversable  // error: not found: value T 

但是編譯器抱怨。

回答

2

隱式解析(包含<%)是編譯時的事情,它基於編譯時已知的類型。

在你的例程中,編譯時唯一知道的關於arg的是它的類型爲T,它幾乎沒有。你可能有一些諸如

def check[T <% GenTraversable[_](arg: T) = ... 

這是絕對不一樣的事情但是如果arg在編譯時已知是GenTraversable你的日常只能被調用。

我不知道你在哪裏寫T <:< GenTraversable[_](可能在預期值的地方)。要獲得從類型AB的隱式轉換,您可以編寫implicitly[A => B],但如果在編譯時無法解析,它將再次失敗。所以在這裏沒有任何幫助,T是一個無約束的泛型參數。

+0

我試圖在更一般的情況下寫入'T <:

1

我不知道我理解你的問題。此代碼的工作對我來說:

class X[T] (name: T) 

class Y[T] (_name: T, age: Int) extends X[T](_name) 

def foo[T](arg: T) = arg match { 
    case a: Y[_] => println("y ") 
    case a: X[_] => println("x ") 
    case _ => println("?") 
} 

val y = new Y("Olle", 3); 
foo(y) 

如果Y是X的一個子類(在這種情況下),那麼你必須是開始,並採取更通用類以後。請再解釋一下這個問題......?

+0

不,嘗試Y不擴展X,但有隱式轉換爲X.並且我想要X和Y在相同的情況下,或者更一般的情況下,我可以檢查參數類型是T <:X或T <%X –

0

我很肯定這是不可能的。模式匹配在運行時發生,implicits和non-implicits之間的區別只在complile-time時才存在。