在 Scala 中抽象類與抽象方法之間有什么區別?何時使用一個與另一個?
class lookup[F[_]] {
def searchUser(username: Username, email: Email): F[Option[User]]
}
object lookup {
def searchUser[F[_]](username: Username, email: Email): F[Option[User]]
}
uj5u.com熱心網友回復:
這兩種情況的語意是不同的。
在第一種情況下F在創建類的實體時解決
class lookup[F[_]] {
def searchUser(username: Username, email: Email): F[Option[User]] = ???
}
val l1 = new lookup[Future]
val l2 = new lookup[List]
l1.searchUser(username1, email1): Future[Option[User]]
l2.searchUser(username2, email2): List[Option[User]]
在第二種情況下F通過方法呼叫解決
object lookup {
def searchUser[F[_]](username: Username, email: Email): F[Option[User]] = ???
}
lookup.searchUser[Future](username1, email1): Future[Option[User]]
lookup.searchUser[List](username2, email2): List[Option[User]]
假設您將再添加一種方法
class lookup[F[_]] {
def searchUser(username: Username, email: Email): F[Option[User]] = ???
def deleteUser(user: User): F[Unit] = ???
}
在這里你知道這F兩種方法是一樣的。但對于
object lookup {
def searchUser[F[_]](username: Username, email: Email): F[Option[User]] = ???
def deleteUser[F[_]](user: User): F[Unit] = ???
}
F在一種方法中和F在另一種方法中可以不同。
也lookup[F[_]]可用于隱式/型別類/背景關系邊界(這在無標簽最終方法中很有用)
def foo[F[_]: lookup] = ???
def foo[F[_]](implicit l: lookup[F]) = ???
而在第二種情況下,您將失去此能力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311172.html
