【发布时间】:2019-06-21 12:27:30
【问题描述】:
我有类似这样的情况:
trait Abst{
type T
def met1(p: T) = p.toString
def met2(p: T, f: Double=>this.type){
val v = f(1.0)
v.met1(p)
}
}
class MyClass(x: Double) extends Abst{
case class Param(a:Int)
type T = Param
val s = met2(Param(1), (d: Double) => new MyClass(d))
}
在我运行它之前它不会显示错误,然后它会说:
类型不匹配;找到:MyClass,必填: MyClass.this.type
我也尝试了泛型类型的解决方案,但后来我遇到了 this.T 与 v.T 不同的冲突
所以如果可能的话,我只需要克服上面的错误信息?
更新
因此,this.type 是该单个实例的 singleton type。我在评论中建议使用
val s = met2(Param(1), (d: Double) => (new MyClass(d)).asInstanceOf[this.type])
所以如果有人对此发表评论,我知道它有多丑陋,只是对它有多不安全感兴趣?
你们也都提议将 Param 的定义移到课堂之外,我绝对同意。所以它的定义会在伴生对象MyClass中
【问题讨论】:
-
我通过将 .asInstanceOf[this.type] 添加到构造函数来成功运行它......现在好了,直到我找到更优雅的东西......
-
您不希望
f为Double => Abst类型是否有特殊原因?我问是因为尽管有一些方法可以在 trait 中引用底层实现的类型,但它们不使用this.type,总体上非常复杂,而且我实际上并没有看到通过避免超类型在这里。 -
@Astrid 在很多情况下,您需要处理子类而不是超类。
-
@Astrid 嗯,你是对的。实际上,我想到了子类具有的所有功能,但无论如何我都无法从超类方法访问它们。谢谢!我是多么蹩脚……
-
不,
(new MyClass(d)).asInstanceOf[this.type]是个坏主意。asInstanceOf的使用应该保留在您确定知道正确类型是什么但无法通过静态类型检查证明的情况下。asInstanceOf用于承诺true 的事情,而不是做出明显错误的陈述。(new MyClass(d)).asInstanceOf[this.type]保证是错误的。请不要以这种方式使用asInstanceOf。
标签: scala inheritance types