Scala Cake Pattern 中的类型错误
Type error in Scala Cake Pattern
我有以下蛋糕图案:
// The framework
trait Frame[R] {
def renderer:ReadRender[R]
trait ReadRender[R] { // <<<--- error
def say[T](src:R) : T
}
}
// A specific implementation
trait StringFrame extends Frame[String] {
def renderer = new StringReadRender()
class StringReadRender() extends ReadRender[String] {
def say[T](src:String) : T = {
println("Say: "+src)
null.asInstanceOf[T] // placeholder--actual work here in real code
}
}
}
// Wiring it up
trait SJ[R] {
this : Frame[R] =>
def foo[T](me:R) = {
println("In foo")
renderer.say[T](me)
}
}
case class Greg() extends SJ[String] with StringFrame
使用默认的编译器设置,这编译干净,似乎工作。如果我启用 -Xlint,我会在上面标记的行中收到此错误:
type parameter R defined in trait ReadRender shadows type R defined in trait ReadRenderFrame. You may want to rename your type parameter, or possibly remove it.
此模式是为 JSON 解析器设计的,以允许用于注入的 mixin 特性支持不同类型的源数据——默认为字符串,但可以是字节流或映射。
我担心它抱怨开启了 -Xlint 审查——这让我想知道 似乎 在没有 -Xlint 的情况下工作是否真的安全,或者我是否只是需要更具体一些吗?
您对 Frame[R]
的定义目前等同于以下内容:
trait Frame[R] {
def renderer:ReadRender[R]
trait ReadRender[R1] { // Defining a new type parameter
def say[T](src:R1) : T
}
}
所以 linter 抱怨,ReadRender[R]
的类型参数与 Frame[R]
的类型参数被调用相同。根据定义,它们在提供的代码中实际上总是相同的:def renderer:ReadRender[R]
。所以可以完全丢掉ReadRender
的类型参数,用Frame
的类型参数代替:
// The framework
trait Frame[R] {
def renderer:ReadRender
trait ReadRender {
def say[T](src:R) : T // R is provided by Frame[R]
}
}
// A specific implementation
trait StringFrame extends Frame[String] { // Setting R to String
def renderer = new StringReadRender()
class StringReadRender() extends ReadRender { // R is equal to String here
def say[T](src:String) : T = {
println("Say: "+src)
null.asInstanceOf[T] // placeholder--actual work here in real code
}
}
}
我有以下蛋糕图案:
// The framework
trait Frame[R] {
def renderer:ReadRender[R]
trait ReadRender[R] { // <<<--- error
def say[T](src:R) : T
}
}
// A specific implementation
trait StringFrame extends Frame[String] {
def renderer = new StringReadRender()
class StringReadRender() extends ReadRender[String] {
def say[T](src:String) : T = {
println("Say: "+src)
null.asInstanceOf[T] // placeholder--actual work here in real code
}
}
}
// Wiring it up
trait SJ[R] {
this : Frame[R] =>
def foo[T](me:R) = {
println("In foo")
renderer.say[T](me)
}
}
case class Greg() extends SJ[String] with StringFrame
使用默认的编译器设置,这编译干净,似乎工作。如果我启用 -Xlint,我会在上面标记的行中收到此错误:
type parameter R defined in trait ReadRender shadows type R defined in trait ReadRenderFrame. You may want to rename your type parameter, or possibly remove it.
此模式是为 JSON 解析器设计的,以允许用于注入的 mixin 特性支持不同类型的源数据——默认为字符串,但可以是字节流或映射。
我担心它抱怨开启了 -Xlint 审查——这让我想知道 似乎 在没有 -Xlint 的情况下工作是否真的安全,或者我是否只是需要更具体一些吗?
您对 Frame[R]
的定义目前等同于以下内容:
trait Frame[R] {
def renderer:ReadRender[R]
trait ReadRender[R1] { // Defining a new type parameter
def say[T](src:R1) : T
}
}
所以 linter 抱怨,ReadRender[R]
的类型参数与 Frame[R]
的类型参数被调用相同。根据定义,它们在提供的代码中实际上总是相同的:def renderer:ReadRender[R]
。所以可以完全丢掉ReadRender
的类型参数,用Frame
的类型参数代替:
// The framework
trait Frame[R] {
def renderer:ReadRender
trait ReadRender {
def say[T](src:R) : T // R is provided by Frame[R]
}
}
// A specific implementation
trait StringFrame extends Frame[String] { // Setting R to String
def renderer = new StringReadRender()
class StringReadRender() extends ReadRender { // R is equal to String here
def say[T](src:String) : T = {
println("Say: "+src)
null.asInstanceOf[T] // placeholder--actual work here in real code
}
}
}