Scala类型不匹配; 发现:需要Int(0):Int

Raj*_*jan 0 scala

我写了下面的包装类Int.

    case class Wrapper[Int](value: Int) {
        def map(f: Int => Int): Wrapper[Int] = Wrapper(f(value))
        def flatMap(f: Int => Wrapper[Int]): Wrapper[Int] = f(value)
        def filter(f: Int => Boolean): Wrapper[Int] = Wrapper(if(f(value)) 0 else value)
    }
Run Code Online (Sandbox Code Playgroud)

当我编译代码时,我得到以下错误 -

    type mismatch; 
    [error]  found   : Int(0)
    [error]  required: Int
    [error]     def filter(f: Int => Boolean): Wrapper[Int] = Wrapper(if (f(value)) 0 else value)
    [error]                                                                         ^
    [error] one error found
Run Code Online (Sandbox Code Playgroud)

我找不到任何明显的错误原因.任何想法如何解决这个问题.

sep*_*p2k 5

通过编写class Wrapper[Int],您已经定义了一个名为的类型参数Int.无论何时Int在类中编写,都要引用该类型参数,而不是实际Int类型.

你的定义完全等同于:

case class Wrapper[T](value: T) {
    def map(f: T => T): Wrapper[T] = Wrapper(f(value))
    def flatMap(f: T => Wrapper[T]): Wrapper[T] = f(value)
    def filter(f: T => Boolean): Wrapper[T] = Wrapper(if(f(value)) 0 else value)
}
Run Code Online (Sandbox Code Playgroud)

如果你试图编译这个版本,你会得到更容易理解的错误,即有Int一个T预期的地方.

如果希望包装器特定于整数,则应删除type参数.

  • 改进的建议是使用`-Xlint`进行编译,它将添加:`warning:类型参数Int在类包装scala中定义的类包装器阴影类Int中定义.您可能想要重命名您的类型参数,或者可能将其删除 (3认同)