- 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.
- Advanced Splunk
- Java逍遙游記
- 深度學習:算法入門與Keras編程實踐
- Java EE 7 Development with NetBeans 8
- 零基礎學Python網絡爬蟲案例實戰全流程詳解(高級進階篇)
- 小程序開發原理與實戰
- QGIS By Example
- Advanced Oracle PL/SQL Developer's Guide(Second Edition)
- Apache Kafka Quick Start Guide
- 大數據分析與應用實戰:統計機器學習之數據導向編程
- Puppet:Mastering Infrastructure Automation
- 用Python動手學統計學
- Unity 5 Game Optimization
- Java核心技術速學版(第3版)
- Building Scalable Apps with Redis and Node.js