在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] {}