![](/img/trans.png)
[英]Scala Generics: Using recovering actual type to call another generic function
[英]Scala generics for generic type
假設我有這段代碼。 它不會編譯。 編譯器似乎認為foreach()中的e不是MyTrait的子類。
class MyCollection[T[A] <: MyTrait[A]](val iterable: Iterable[T]) extends Iterable[T]{
override def iterator: Iterator[T] = ???
def doStuffWithAll = iterable.foreach(e => e.doStuff)
}
trait MyTrait[T]{
def doStuff = println("doing stuff")
}
該集合是MyTrait實現的集合的包裝,它將具有一些便捷方法。 我希望MyTrait也能通用,並確保MyCollection僅包含帶有type參數的MyTrait的實現。 那可能嗎?
您可以使用MyTrait[A]
作為提供Iterator
的類型
class MyCollection[A](iterable: Iterable[MyTrait[A]]) extends Iterable[MyTrait[A]] {
override def iterator: Iterator[MyTrait[A]] = ???
def doStuffWithAll = iterable.foreach(_.doStuff)
}
如果要按照嘗試的方式進行操作,則會忘記將A
作為類型參數傳遞。
class MyCollection[A, T[A] <: MyTrait[A]](iterable: Iterable[T[A]]) extends Iterable[T[A]] {
override def iterator: Iterator[T[A]] = ???
def doStuffWithAll = iterable.foreach(_.doStuff)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.