You can't return ()
having type Unit
if you promised to return Storage
(storage: Storage
).
Either return a Storage
val storage: Storage =
if (config.storageType == StorageType.MAP)
MapStorage()
else if (config.storageType == StorageType.LIST)
ListStorage()
else MapStorage() // or ListStorage() or some other storage
or make one of the cases default
val storage: Storage =
if (config.storageType == StorageType.MAP)
MapStorage()
else // default case
ListStorage()
or if you really can't return any of storages in the default case, return null
(it's worse since this can lead to NullPointerException
in the code for unknown reason)
val storage: Storage =
if (config.storageType == StorageType.MAP)
MapStorage()
else if (config.storageType == StorageType.LIST)
ListStorage()
else null
// null has type `Null`, which is a subtype of any reference type, e.g. Storage
// Null <: Storage
// Null | Storage =:= Storage
or throw exception with a proper message (it's better than returning null
)
val storage: Storage =
if (config.storageType == StorageType.MAP)
MapStorage()
else if (config.storageType == StorageType.LIST)
ListStorage()
else throw new RuntimeException("unexpected storage type")
// throwing exception has type Nothing, which is a subtype of any type, e.g. Storage
// Nothing <: Null <: Storage
// Nothing | Storage =:= Storage
or change signature to Option
(it's even better than throwing but you'll probably have to fix also places where storage
is used)
val storage: Option[Storage] =
if (config.storageType == StorageType.MAP)
Some(MapStorage())
else if (config.storageType == StorageType.LIST)
Some(ListStorage())
else None
Technically, you can return union type Unit | Storage
in Scala 3 (or its emulation in Scala 2) but such signature would be weird.