首页 > 解决方案 > Scala下界错误:值不是类型参数的成员

问题描述

scala 编译器似乎会为具有多个下限的语句提供错误的类型错误。

给定类Foo,其方法使用和g的下限AB

class Foo[A, B](a: A, b: B) {
  def g[T, A1 >: A <: T, B1 >: B <: T] = List[T](a: A1, b: B1)
}

来自https://stackoverflow.com/a/6124549和类XY <: XZ <: X

abstract class X {def a: String}
object Y extends X {def a = "this is Y"}
object Z extends X {def a = "this is Z"}

正如预期的那样,以下代码可以正常工作:

Y.a
new Foo(Y,Z).g
new Foo(Y,Z).g.head // instance of Y, type X
new Foo(Y,Z).g.head.isInstanceOf[X] // true
new Foo(Y,Z).g.head.asInstanceOf[X].a
new Foo(Y,Z).g[X,Y.type,Z.type].head.a
new Foo(Y,Z).g[X,X,X].head.a
{val y = new Foo(Y,Z).g.head; y}.a

出奇,

new Foo(Y,Z).g.head.a

没有!_ (在 Scala 2.12.7、2.12.8、2.13.0-M5 中测试,但在 Dotty 中确实可以正常工作)

它产生error: value a is not a member of type parameter T.

这是编译器中的错误还是有特定原因,为什么我不能a调用new Foo(Y,Z).g.head

y获取 type X,因此编译器显然可以找出它new Foo(Y,Z).g.head的 type X,而我不明白,为什么将其分配给新值并调用该方法有助于类型检查器。另外,我认为,显式转换为X不应该改变任何东西,但确实如此。

在线尝试!

标签: scalatypesscala-compiler

解决方案


推荐阅读