2013-10-08 104 views
2

我試圖做這樣的事情多約束:指定一個類型(斯卡拉)

abstract class DbFinder[T <: PublicKey with Null] 

但是當我嘗試返回類型T的對象爲空,則無法編譯。以前我有:

abstract class DbFinder[T >: Null] 

它高興地讓我返回null。

我假設我對第一行代碼有些困惑。我想堅持T擴展公鑰,但也可以是空的。我該怎麼做呢?

問候

回答

6

我認爲最好的方法是使用一種選擇,所以你可以使用無來模擬空傳:

abstract class DbFinder{def someMethod(a: Option[PublicKey]): Any = ...} 

在你的代碼中的NULL約束是多餘的,因爲每個Scala的引用類型從Null繼承,所以你只是簡單地陳述你期望一個PublicKey子類的實例。

而且,順便說一下,您應該避免在Scala中使用null,如上所述。

+0

是的,很棒的留言謝謝 – Imran

+2

不,空是所有參考類型的子類型。沒有什麼是所有類型的子類型。 –

+0

當我看到PublicKey with Null時,想到了同樣的事情,那種冗餘不是嗎? :) – pedrofurla

2

像這樣:

abstract class DbFinder[T >: Null <: PublicKey] 

使用Null作爲上限沒有幫助,因爲Nothing是默認的下界,並Nothing不能null