我试图实现一个类似的结构,其想法是有一个共同特征来处理不同的输入实例,无论它们的InType如何。
trait AnyInput {
type InType
val obj : InType
}
abstract class Input[T](obj: T) extends AnyInput {
type InType = T
}
case class InpImage(image: ByteStream) extends Input[ByteStream](image)
case class InpString(text: String) extends Input[String](text)
.
.
.
trait InputProcessor[T <: Input[T#InType]] {
...
}
我在InputProcessor定义中得到了“涉及类型T错误的循环引用”
重要的是要注意,可能有一些不同的case类实现Input [String]或Input [ByteStream]。所以把它写成
case class StringInput(s: String) extends Input[String](s)
case class IntInput(numb: Int) extends Input[Int](numb)
不是最好的解决方法
答案 0 :(得分:0)
也许你可以使用
trait InputProcessor[S, T <: Input[S]] {
// ...
}
答案 1 :(得分:0)
你可以尝试这样的事情
trait InputProcessor[S <: AnyInput, T <: Input[S#InType]] {
implicit val evidence: T =:= S = implicitly[T =:= S]
}
并且实施将是:
class ImageProcessor extends InputProcessor[InpImage, InpImage] { }
您可以在此处详细了解=:=
:https://stackoverflow.com/a/3427759/245024
编辑:
为证据添加了一个例子和实施
请注意,在扩展InputProcessor
时,如果传递2个不同的类型参数,代码将无法编译(如您所料)