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

阿塔瓦兹德·巴拉扬(Artavazd Balayan)

为什么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,不是吗?

更新:

我想用确切的类型实现此特征DatabaseConfigProvider并以这种方式做到这一点:

val dc: DatabaseConfig[JdbcProfile] = ???
val prov = new DatabaseConfigProvider {
  def get[P <: BasicProfile] = dc.asInstanceOf[DatabaseConfig[P]]
}

因为看起来丑陋asInstanceOf

叶夫根尼

方法的输出类型get由调用方定义。您添加了类型界限(如T <: Profile),但这仅意味着对调用者的限制。如果调用方要求您提供另一种类型的子类型,则任何类型的转换(如您所做的那样)都会在运行时失败Profile

如果您提供有关期望得到的结果的更多详细信息,我可以提供具体建议,以扩大答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当从具有通用(Int)返回类型的函数返回Dynamic(String)时,Haxe编译器为什么不抱怨?

编译器抱怨静态解析参数

数据类型不匹配和冲突的编译器

为什么 TypeScript 编译器不会抱怨形状不匹配的对象?

编译器的行为与通用方法的null参数不同

即使重载函数的参数计数不匹配,编译器是否应该实例化所有参数相关类型

是否有一个 gcc 编译器选项可以帮助捕获形式和实际参数类型不匹配?

通用lambda的编译器推断类型

为什么编译器不抱怨此错误?

为什么java编译器不抱怨“\ s”?

为什么我的Java编译器级别与安装的项目方面不匹配?

隐式方法参数解析?Scala编译器?

编译器抱怨类型错误,但这显然是正确的

嵌套类型数组:编译器为何抱怨?

编译器抱怨数据类型错误

Google Closure编译器发出警告:类型不兼容;即使参数具有通用类型,有没有办法解决?

Grails编译器不匹配

相同的声明和类型编译器错误。(xyz* 类型的 arg 与 xyz* 类型的参数不兼容)

有关相同方法的参数类型冲突和转换不兼容的编译器错误

当编译器找到Serializable而不是match类型时,如何解决类型不匹配的问题?

编写通用的Scala合并函数,无法为编译器排列类型

为什么Scala编译器会两次识别通用类型

C#编译器无法通过约束来解析通用类型参数

当用不相关的接口类型调用时,为什么编译器选择带有类类型参数的通用方法?

理解产量会导致类型不匹配的编译器错误

不同C ++编译器之间的自动类型推导不匹配

函数声明和定义的返回类型不匹配,尽管编译器还可以吗?

闭包编译器警告-HTMLCanvasElement和元素类型不匹配

Kotlin编译器错误:类型不匹配。必需:CapturedType(out A)找到:A