Scala编译器抱怨方法级别的泛型参数的类型不匹配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala编译器抱怨方法级别的泛型参数的类型不匹配相关的知识,希望对你有一定的参考价值。
为什么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
,不是吗?
Update:
我想用精确类型实现这个特性DatabaseConfigProvider并以这种方式执行:
val dc: DatabaseConfig[JdbcProfile] = ???
val prov = new DatabaseConfigProvider {
def get[P <: BasicProfile] = dc.asInstanceOf[DatabaseConfig[P]]
}
由于asInstanceOf
看起来很难看。
答案
方法get
的输出类型由调用者定义。您添加了类型边界(如T <: Profile
),但这仅表示调用者的限制。如果调用者要求Profile
的另一个子类型而不是你输入的子类型,那么任何强制转换(如你所做的那样)都会在运行时失败。
如果您提供有关您希望得到的结果的更多详细信息,我可以通过具体的建议如何获得它来扩展答案。
另一答案
你错误地声明了输入参数。试试以下:
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?)
以上是关于Scala编译器抱怨方法级别的泛型参数的类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章