[英]In Scala, should it be possible to instantiate an existential type?
更新以删除伪造的示例。
这个(编译的)应该有效吗?
trait Foo[X]
val foos: Seq[Foo[_]] = Seq()
这些实例化的存在似乎只会导致下游编译器错误,恕我直言,不应编译,而应编写为:
val foos: Seq[Foo[Any]] = ...
我想念什么?
( 对此博客帖子的反应。)
您并不是在这里真正实例化一个存在性类型:
trait Foo[X]
val foos: Seq[Foo[_]] = Seq()
Seq()
将返回Nil
,该Nil
(在任何情况下)都是List[Nothing]
或扩展名Seq[Nothing]
。 Seq[Nothing]
是Seq[Foo[_]]
(尽管这很简单,因为Nothing
是任何事物的子类型)。
再举一个具体的例子:
scala> val foos: Seq[Foo[_]] = Seq(new Foo[Int]{})
foos: Seq[Foo[_]] = List($anon$1@327ca223)
我仍然没有实例化一个存在性类型。 我正在创建一个Seq[Foo[Int]]
,它也是一个Seq[Foo[_]]
。 而且我当然不能直接尝试这样做:
scala> new Foo[_]{}
<console>:10: error: class type required but Foo[_] found
new Foo[_]{}
Seq[Foo[_]]
不一定是不安全的。 正如@TravisBrown建议的那样,您仍然可以使用完全不依赖于类型的收集方法。 即使没有类型,我们仍然可以使用类型约束来做(某种程度上)有用的事情:
def foo(list: List[ _ <: AnyVal]): String = list.mkString
scala> foo(List(1, false, true, 2.3))
res34: String = 1falsetrue2.3
好的,在这种情况下,拥有List[AnyVal]
并没有多大用处,如果没有一个复杂的示例,提出一个好的用List[AnyVal]
有点困难。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.