【发布时间】:2012-10-18 01:26:27
【问题描述】:
这让我很不爽:
trait Foo[A]
class Bar[A](set: Set[Foo[A]] = Set.empty)
这会产生
<console>:8: error: polymorphic expression cannot be instantiated to expected type;
found : [A]scala.collection.immutable.Set[A]
required: Set[Foo[?]]
class Bar[A](set: Set[Foo[A]] = Set.empty)
^
我不得不重复Set.empty中的类型参数,这很烦人。为什么使用此默认参数进行类型推断会失败?以下作品:
class Bar[A](set: Set[Foo[A]] = { Set.empty: Set[Foo[A]] })
请注意,这与Set 无关:
case class Hallo[A]()
class Bar[A](hallo: Hallo[A] = Hallo.apply) // nope
奇怪的是,不仅如此:
class Bar[A](hallo: Hallo[A] = Hallo.apply[A])
...还有这个:
class Bar[A](hallo: Hallo[A] = Hallo()) // ???
【问题讨论】:
-
不是答案,但需要注意三件事:您可能希望将类型参数命名为
A以外的名称,以避免与found: [A]scala.collection.immutable.Set[A]消息中的(不同)A混淆;关于Set和你的Hallo的重要事实是它们是不变的(而不是说List);并且您的最后一行编译 put 可能无法满足您的要求。 -
而
class Bar[ A ]( hallo: Hallo[ A ] = Hallo.apply )如果您将其更改为使用Hallo.apply()它工作正常。你应该可以去掉括号,所以这里一定很混乱。它认为您正在传递部分应用的函数Hallo.apply,而不是在没有参数的情况下调用apply。 (错误消息说它找到了类型[A]()Hallo[A]。)
标签: scala default-value type-inference