2011-12-28 92 views
6

說我有一個類:默認通用值

class SomeClass[+A <: AnyRef, +B <: Any] 

要指定它,我總是要過指定類型的泛型參數。即將其最通用版本指定爲方法參數類型,我必須執行def someMethod(param1: SomeClass[AnyRef, Any])new SomeClass[AnyRef, Any]來實例化它。當涉及具有複雜泛型的更復雜類型時,它將成爲一大難題。

當我不提供通用信息時,是否有辦法使[AnyRef, Any]部分隱含?例如def someMethod(param1: SomeClass)

難道_可以幫我解決這個問題嗎?

P.S.我很抱歉沒有清楚地說明問題。

+1

如果要保存一些打字後,你可能會想嘗試一個類型別名,比如'型SomeClassAny = SomeClass [AnyRef,Any]'。 – huynhjl 2011-12-28 20:05:58

+0

一個默認的'value'(見你問題的標題)是不同的:'Foobar(b:Int = 42)';你在談論類型參數。 – 2011-12-28 20:42:18

+0

@huynhjl似乎'type'是最合適的解決方案。你應該將其作爲回答發佈 – 2011-12-28 21:30:06

回答

7

如我的評論所說,做這樣的事情可以節省一些打字,是非常簡單的:

type SomeClassAny = SomeClass[AnyRef, Any] 
3

這個怎麼樣?

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class SomeClass[+A <: AnyRef] 

object SomeClass { 
    def apply() = new SomeClass[AnyRef] 
} 

// Exiting paste mode, now interpreting. 

defined class SomeClass 
defined module SomeClass 

scala> SomeClass() 
res47: SomeClass[AnyRef] = [email protected] 

編輯:

我想你想的東西像默認參數,但在類型級別。不幸的是Scala沒有任何這樣的功能。您可以使用@hyhnhjl建議的類型別名。對我來說這似乎是你最好的選擇。

+0

請重新考慮我的問題 - 我做了一些更正。我很抱歉,最初沒有說清楚。 – 2011-12-28 19:53:35

1

通常它可以從構造函數參數的類型推斷出來,但是如果構造函數沒有使用任何參數,則必須明確指定類型。當然,正如missingfaktor指出的那樣,你總是可以寫一個方法來爲你節省一些輸入。

+0

請重新考慮我的問題 - 我做了一些更正。我很抱歉,最初沒有說清楚。 – 2011-12-28 19:53:19

5

如果您沒有真正保養關於這種東西會有什麼類型,您可以用[_,_]對它進行參數化。例子可能是一些類似

val thing = new SomeClass[_, _]() 

def thingDoer(sc: SomeClass[_, _]) { /* Stuff */ } 

更清楚它的性質了一下,下劃線被稱爲「生存型」,它基本上是一個原始類型的等價在Java中,它也可以類似於Java的通配符類型。例如,這種精神分裂的Java代碼

public void thingThatTakesAMapList(List<? extends Map> mapList) { /* Whatever */ } 

是一樣的,因爲這Scala代碼

def thingThatTakesAMapList(mapList: List[_ <: Map[_, _]]) { /* Some incredibly wild subroutine */ } 

此外,值得注意的名單之區分[任何]和List [_] ...是非常微妙。前者是Any的列表,後者是[我不知道/關心]的列表。儘管如此,_ 完全不同。例如,如果你有一類與此簽名

class SillyClass[T <: Map[_, _]] 

它不會是有效的做到這一點

val thing = new SillyClass[Any]() 

同時可能有效期爲你做這個

val thing = new SillyClass[HashMap[_, _]]() 

,如果函數將SillyClass作爲參數,則可以編寫

def sillyClassTaker(sc: SillyClass[_]) 

並且確定sc是而不是將要通過類型Any進行參數化;它是通過Map [_,_]的某個未知子類進行參數化的。也就是說,下劃線是佔位符,但它仍然需要有效的類型參數。所以,雖然這很酷,所有...我不特別推薦使用它太多。如果你需要做一些... wildcard-y,或者根本不在乎類型參數,那麼這是一個很好的選擇。

+1

感謝您的解釋。但是List [_ <:Map [_,_]]和List [Map [_,_]]之間的實際區別是什麼?和'List [_]'和'List [Any]'之間? – 2011-12-28 21:34:08

+0

我已編輯我的帖子來解決您的問題。 – Destin 2011-12-28 21:47:19