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

但是SomeProfileT,不是吗?

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编译器抱怨方法级别的泛型参数的类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

17.scala的泛型类

JAVA中的泛型类是啥东西?

泛型-类型擦除

匹配参数的可空性和返回类型的泛型类型参数

Scala笔记整理:类型参数(泛型)与隐士转换

通过给定的泛型类型 Scala 获取类的伴随对象