2012-03-28 268 views
0

在Scala中,我怎麼可以做這樣的事情的超類型:斯卡拉類型參數

def cast [Type] (x: _ >: Type, errMsg: String): Type = { 
    if (x.isInstanceOf[Type]) { 
     x.asInstanceOf[Type] 
    } else { 
     throw new Exception(errMsg) 
    } 
} 

x: _ >: Type意爲「x的類型(不Scala中存在的符號)是類型的任何超」。

+1

您的意圖是什麼?只調用'x.asInstanceOf [Type]'有什麼區別? – paradigmatic 2012-03-28 09:22:20

回答

4

如果x可以是任何超類型Type,那麼當然它可以是Any。這完全沒有限制,你可以寫x : Any

在另一行上,由於類型擦除,你x.isInstanceOf[Type]將不會做有用的檢查。您無法檢查類型參數。 (您必須確保類型信息在運行時可用,您可以使用Manifest獲得)。

+0

有趣。有什麼辦法可以限制直接超類型嗎?另外,isInstance的效用是什麼? – Norswap 2012-03-28 09:24:07

+2

限制直接超類型:沒有辦法做到這一點,不知道這可能是多麼有用。 isInstanceOf的實用程序:如果參數是顯式類型名稱,而不是類型參數,則它有效。 – 2012-03-28 12:47:56

2

試試這個:

def cast[T >: Type](x: T, errMsg: String): T = { ... } 

但是,您可能要重新考慮在Scala中明確類型轉換的必要性。

+0

其實我想要它,所以「T」和「Type」都是未知的。 (我不應該使用類型強硬,我似乎記得它是一個Java類。) – Norswap 2012-03-28 09:15:35