在Scala中使用通配符

在Scala中使用通配符,scala,Scala,鉴于: 这两者之间的区别是什么: scala> trait Thingy[A] {} defined trait Thingy 及 以下内容显示了一个差异: 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:T

鉴于:

这两者之间的区别是什么:

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

以下内容显示了一个差异:

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)
:24:错误:类型不匹配;
找到:Thingy[$2]其中类型为$2
必需:Thingy[A]
定义条[A](x:Thingy[A]):Thingy[A]=g(x)
^

但是,请解释
f
g
之间的区别
g
的等效语法是:

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)
                                              ^

。。。除了抱怨,因为
A
B
不相等。使用
\uu
,您告诉编译器放弃有关
A
B
的任何信息。因此,它无法证明在
bar
中,
g
的输入类型与输出类型相同。

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

def g[A, B](x: Thingy[A]): Thingy[B] = x

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

,这接近真实,但并不完全正确:它们显然是不等价的,因为问题中的版本可以编译,而您的版本不能!不同之处在于,在您的示例中,调用者选择了
B
,在
版本中,实现是这样做的;def g(x:LL):LL=List[Int]()
我想提一下,但实际上我决定不提:)是的,“带有某种类型参数的东西”有点暗指:)
def g[A, B](x: Thingy[A]): Thingy[B] = x
def g(x: Thingy[_]): Thingy[_] = new Thingy[Int] {}