鉴于:
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)
^
但是,请解释
f
和g
之间的区别。 最佳答案
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/