涉及T类的非法循环引用

时间:2018-03-18 07:35:57

标签: scala types

我试图实现一个类似的结构,其想法是有一个共同特征来处理不同的输入实例,无论它们的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)

不是最好的解决方法

2 个答案:

答案 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个不同的类型参数,代码将无法编译(如您所料)