【发布时间】:2019-02-09 18:48:39
【问题描述】:
考虑以下情况:
class Program { }
object Program { }
object Generator{
val program: Program = new Program
def met = {
val mychecker = Checker(program)
mychecker.check
}
}
trait Checker {
val program: Program
def check
}
trait Order {
val checker: Logic
def met1: Nothing = checker.program
}
object Checker{
def apply(p: Program) = new {
val program: p.type = p
} with Logic { self =>
object AnOrder extends {
val checker: self.type = self
} with Order
val order = AnOrder
}
}
trait Logic extends Checker { self =>
protected val order: Order { val checker: self.type }
def check = order.met1
}
Generator.met
在这里,我写def met1: Nothing 是为了让你明白我的意思,基本上生成器和检查器的程序类型是不同的。所以我得到了
类型不匹配;找到:Order.this.checker.program.type(与 底层类型 Playground.this.Program) 需要:没有
现在,我的问题不是关于这个错误。我想问一下,当您有两个模块 M1 和 M2 时,如何避免使用 asInstanceOf 进行转换,其中一个将 T 类型的一些数据传递给 M2,M2 进行一些计算,然后返回相同的数据类型(直到这个差异,我们见错误)。
在上面的例子中你会怎么做?
现实世界的错误
正如我在我的一个 cmets 中所解释的那样,编译器不会通过更复杂的 Program 实例。例如,请参阅 my project,您无法使用 sbt -> compile 进行编译。您会看到由于这里提到的问题,terminationCache 给出了类型错误,我需要使用 asInstanceOf。
【问题讨论】:
-
首先如果你可以定义你自己的类型,比如这个类型的程序。或者您可以使用案例类或案例对象,如果它不带任何参数。现在,如果您想使某种类型成为通用类型,那么您可以采取一些方法。最简单的方法是用空特征扩展它。
-
@RamanMishra 我不太清楚你的提议实际上是什么......
-
你需要隔离问题,不清楚你的意思。路径相关类型被创建为不同的类型,但我在您的代码中看不到任何路径相关类型。
-
请问投反对票的人也可以要求结束这个问题吗?
-
@BrianMcCutchon 不,因为已经有两个答案,帮助中心说在这种情况下我不能删除它!