鉴于:

scala> trait Thingy[A] {}
defined trait Thingy

之间有什么区别:
scala> def f[A](x: Thingy[A]): Thingy[A] = x
f: [A](x: Thingy[A])Thingy[A]


scala> def g(x: Thingy[_]): Thingy[_] = x
g: (x: Thingy[_])Thingy[_]

下面显示了区别:
scala> def foo[A](x: Thingy[A]): Thingy[A] = f(x)
foo: [A](x: Thingy[A])Thingy[A]

scala> def bar[A](x: Thingy[A]): Thingy[A] = g(x)
<console>:24: error: type mismatch;
 found   : Thingy[_$2] where type _$2
 required: Thingy[A]
       def bar[A](x: Thingy[A]): Thingy[A] = g(x)
                                              ^

但是,请解释fg之间的区别。

最佳答案

g的类型表示:给定带有某些类型参数的Thingy,它返回带有某些(可能不同)类型参数的Thingy。例如。这将是合法的实施:

def g(x: Thingy[_]): Thingy[_] = new Thingy[Int] {}

现在很明显,bar不适用于g的定义,因为它总是返回Thingy[Int],而不管A如何。而且由于编译器仅使用g的类型(而不是实现),因此它必须拒绝bar

关于scala - 在Scala中使用通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32721364/

10-10 13:53