看起来很丑陋
为什么Scala编译器无法编译下一个代码:
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
,否?
更新:
我想用精确的类型来实现此特征数据Abaseconfigprovider,并以此方式进行:
val dc: DatabaseConfig[JdbcProfile] = ???
val prov = new DatabaseConfigProvider {
def get[P <: BasicProfile] = dc.asInstanceOf[DatabaseConfig[P]]
}
由于asInstanceOf
。
您错误地声明了输入参数。在下面尝试:
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中轻松找到(例如:[b&gt;:a]在scala中做什么?
方法get
的输出类型由呼叫者定义。您添加了键入范围(作为T <: Profile
(,但这确实意味着呼叫者的限制。如果呼叫者要求另一种Profile
的子类型,则在运行时(就像您所做的那样(都会在运行时失败。
如果您提供有关结果期望获得的更多详细信息,我可以通过特定的建议进行答案。