我想編寫一個採用嵌套類型的泛型類。外部類型(I
)必須擴展Iterable,內部類型(M
)可以是任何東西。Scala中的嵌套類型的類型推斷
這裏是我有例子:
// The outer type here is I and the inner type is M
class GenericDistributor[I <: Iterable[M], M] {
def map(input: I): Unit = {
input.foreach(item => {
//do some stuff
})
}
}
class IntegerGroup(id: Int, items: Set[Int]) extends Iterable[Int] {
override def iterator: Iterator[Int] = items.iterator
}
object IntegerGroupDistributor extends GenericDistributor[IntegerGroup, Int]
val integerGroup = new IntegerGroup(1, Set(1,2,3))
IntegerGroupDistributor.map(integerGroup)
的問題是,我必須明確地定義,我不想給GenericDistributor類內部M型。是否有一種方法讓Scala自動推斷給定外部類型的內部類型?
編輯
根據@Arioch的評論。我嘗試了鴨子類型,似乎解決了我的問題,但我仍然覺得應該有更好的方法。
class GenericDistributor[I <: {type M; def iterator: Iterator[M]}] {
def map(input: I): Unit = {
val it: Iterator[M] = input.iterator
it.foreach(println)
}
}
class IntegerGroup(id: Int, items: Set[Int]) extends Iterable[Int] {
type M = Int
override def iterator: Iterator[Int] = items.iterator
}
object IntegerGroupDistributor extends GenericDistributor[IntegerGroup]
https://dzone.com/articles/duck-typing-scala-structural? –
鴨子類型似乎解決了我的問題,但仍然不確定如果我可以做到這一點,而不設置'type M = Int' – mehmetgunturkun
你可以使用直接繼承嗎? 'class GenericDistributor [M] {def map(input:Iterable [M]):Unit = {input.foreach(item => {...' - 換句話說,在你的例子中你永遠不需要'I',你只需要'M'無處不在,爲什麼還要麻煩?///我猜scala的主要問題在於Iterable是一個特性,所以你可以像'class IntegerGroup(id:Int,items:Set [Int])擴展Iterable [Int] Iterable [Double] Iterable [String]' –