我試圖做這樣的事情多約束:指定一個類型(斯卡拉)
abstract class DbFinder[T <: PublicKey with Null]
但是當我嘗試返回類型T的對象爲空,則無法編譯。以前我有:
abstract class DbFinder[T >: Null]
它高興地讓我返回null。
我假設我對第一行代碼有些困惑。我想堅持T擴展公鑰,但也可以是空的。我該怎麼做呢?
問候
我試圖做這樣的事情多約束:指定一個類型(斯卡拉)
abstract class DbFinder[T <: PublicKey with Null]
但是當我嘗試返回類型T的對象爲空,則無法編譯。以前我有:
abstract class DbFinder[T >: Null]
它高興地讓我返回null。
我假設我對第一行代碼有些困惑。我想堅持T擴展公鑰,但也可以是空的。我該怎麼做呢?
問候
我認爲最好的方法是使用一種選擇,所以你可以使用無來模擬空傳:
abstract class DbFinder{def someMethod(a: Option[PublicKey]): Any = ...}
在你的代碼中的NULL約束是多餘的,因爲每個Scala的引用類型從Null繼承,所以你只是簡單地陳述你期望一個PublicKey子類的實例。
而且,順便說一下,您應該避免在Scala中使用null,如上所述。
像這樣:
abstract class DbFinder[T >: Null <: PublicKey]
使用Null
作爲上限沒有幫助,因爲Nothing
是默認的下界,並Nothing
不能null
。
是的,很棒的留言謝謝 – Imran
不,空是所有參考類型的子類型。沒有什麼是所有類型的子類型。 –
當我看到PublicKey with Null時,想到了同樣的事情,那種冗餘不是嗎? :) – pedrofurla