为什么Scala编译器无法编译next code:
trait Profile {}
class SomeProfile extends Profile
trait Foo {
def get[T <: Profile]: Option[T]
}
object Example {
val foo: Foo = new Foo {
// This works (but might give runtime exception), but it is not ugly? :)
def get[T <: Profile]: Option[T] = Some((new SomeProfile).asInstanceOf[T])
}
val foo2: Foo = new Foo {
// This does not compile with type mismatch :(
def get[T <: Profile]: Option[T] = Some(new SomeProfile)
}
}
编译说:
type mismatch;
found : Playground.this.SomeProfile
required: T
但SomeProfile
是T
,不是吗?
我想要使用确切类型实现此特征{{3}}并以这种方式执行:
val dc: DatabaseConfig[JdbcProfile] = ???
val prov = new DatabaseConfigProvider {
def get[P <: BasicProfile] = dc.asInstanceOf[DatabaseConfig[P]]
}
由于asInstanceOf
而看起来很丑陋。
答案 0 :(得分:1)
您错误地声明了输入参数。请尝试以下:
trait Profile {}
class SomeProfile() extends Profile
trait Foo {
def get[T >: Profile]: Option[T]
}
object Example {
val foo2: Foo = new Foo {
override def get[T >: Profile]: Option[T] = Some(new SomeProfile())
}
}
解释:>
的作用,您可以在Stackoverflow中轻松找到(例如:What does [B >: A] do in Scala?)
答案 1 :(得分:1)
方法get
的输出类型由调用者定义。您添加了类型边界(如T <: Profile
),但这仅表示调用者的限制。如果调用者要求另一个Profile
子类型而不是你投射的子类型,那么任何强制转换(如你所做的那样)都会在运行时失败。
如果您提供有关您希望获得的结果的更多详细信息,我可以通过具体的建议来解答如何获得答案。