官术网_书友最值得收藏!

  • Learn Scala Programming
  • Slava Schmidt
  • 228字
  • 2021-06-10 19:35:46

Existential types

Existential types come into play if we stop caring about the specifics of type parameters. Taking our previous example, if we have a method that expects a glass of something, but inside the method, we do not actually care what this something is, then we get the following:

def drink[T <: Water](g: Glass[T]): Unit = { g.contents; () }

In this definition, we actually don't need to know what T is, we just want to make sure that it is some kind of Water. Scala allows you to have an underscore as a placeholder, in the same way it can be utilized to denote unused variables:

def drink[_ <: Water](g: Glass[_]): Unit = { g.contents; () }

This is a placeholder syntax for existential types. As we saw previously, if the upper bound is omitted, scala.Any is assumed. In the case that the lower bound hasn't been defined, the compiler will implicitly add scala.Nothing.

This syntax is just a shorter version of the more powerful syntax T forSome { Q }, where Q is a sequence of type declarations, for example:

import scala.language.existentials
val glass = Full[T forSome { type T <: Water }](new Water(100))

Existential types are considered to be an advanced language feature and so need a respective import to be in scope or to be enabled as a compiler option.

主站蜘蛛池模板: 神木县| 隆回县| 铜川市| 洛扎县| 曲靖市| 双鸭山市| 石台县| 台北县| 桦川县| 卢龙县| 富川| 项城市| 嘉义市| 大渡口区| 武山县| 凌海市| 砀山县| 宁南县| 密云县| 孟州市| 玛多县| 会泽县| 永州市| 泸州市| 德昌县| 德昌县| 江源县| 郁南县| 罗江县| 普格县| 调兵山市| 遂平县| 正蓝旗| 芮城县| 横山县| 义马市| 福鼎市| 南投县| 民丰县| 布拖县| 宾阳县|