Scala编译器正在抱怨方法级别上的通用参数类型不匹配



为什么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

但是SomeProfileT,否?

更新:

我想用精确的类型来实现此特征数据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的子类型,则在运行时(就像您所做的那样(都会在运行时失败。

如果您提供有关结果期望获得的更多详细信息,我可以通过特定的建议进行答案。

相关内容

  • 没有找到相关文章

最新更新