繁体   English   中英

在Scala中,是否可以实例化存在类型?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM