如果你有map
接受T <: Bar[_]
那麼它應該工作:
scala> :pa
// Entering paste mode (ctrl-D to finish)
class Bar[BR]
class Baz extends Bar[Int] {
def bazMethod: Unit = {}
}
def map[B, T <: Bar[_]](args: Seq[T])(method: T => B): Seq[B] = args.map(method)
// Exiting paste mode, now interpreting.
defined class Bar
defined class Baz
map: [B, T <: Bar[_]](args: Seq[T])(method: T => B)Seq[B]
scala> val bazes = Seq(new Baz)
bazes: Seq[Baz] = List([email protected])
scala> map(bazes)(b => b.bazMethod)
res0: Seq[Unit] = List(())
否則,@碧玉-M所指出的,如果你想訪問類型參數A
,你會做這樣的事情:
scala> :pa
// Entering paste mode (ctrl-D to finish)
class Bar[BR]
class Baz extends Bar[Int] {
def bazMethod: Unit = {}
}
def map[B, T <: Bar[A], A](args: Seq[T with Bar[A]])(method: T => B): Seq[B] = args.map(method)
// Exiting paste mode, now interpreting.
defined class Bar
defined class Baz
map: [B, T <: Bar[A], A](args: Seq[T with Bar[A]])(method: T => B)Seq[B]
scala> val bazes = Seq(new Baz)
bazes: Seq[Baz] = List([email protected])
scala> map(bazes)(b => b.bazMethod)
res0: Seq[Unit] = List(())
爲什麼不使用繼承並在Bar中定義抽象的'bazMethod'? –
@VictorMoroz在實際的代碼中,我正在對'''Bar'''實施相應的類實際上是在一些第三方庫中。我只能自由修改'''Baz'''。我也想通過類型參數來驗證解決方案的存在性,然後繼續我知道的繼承。它對我有學習價值。 – shayan