標籤:

Dotty 0.8.0-RC1 發布

Dotty 0.8.0-RC1 發布

來自專欄 Dotty

鏈接:Announcing Dotty 0.7.0 and 0.8.0-RC1


Dotty 0.8.0-RC1 中的新特性

1、類型多態 #4108

Dotty 0.8.0-RC1 中添加了一個新的類型 scala.AnyKind。AnyKind 類似於 Any,是所有類型的上界,但是不同於 Any 的是,它不僅僅是普通類型的上界,同時還是高階類型(Higher-kinded type)的上界。譬如這個例子:

def f[T <: AnyKind] = ???

我們能用類型或者類型構造器來充當 f 的類型參數:

f[String]f[Any]f[List]f[Map]f[[_] => String]

上邊界是 AnyKind 的類型不能被當做值的類型,也不能為他傳遞類型參數,你只能將他作為反省參數傳遞到其他接受 AnyKind 類型的地方。

該功能是實驗性的,只有在添加了編譯參數 -Ykind-polymorphism 的時候才會被啟用。

2、未經檢查的錯誤 #4045

現在 Dotty 會對因為類型擦除而無法在運行時進行檢查的類型檢查產生警告:

scala> def foo(x: Any) = x.isInstanceOf[List[String]]1 |def foo(x: Any) = x.isInstanceOf[List[String]] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | the type test for List[String] cannot be checked at runtime

有些時候 Dotty 的檢查比 Scalac 更加智能:

trait Markerdef foo[T](x: T) = x match { case _: T with Marker => // scalac emits a spurious warning case _ =>}

3、增強 SAM 轉換支持 #4152

現在 Dotty 增強了對 SAM 轉換的支持,我們可以輕鬆的在 Dotty 里使用 Java 的 Stream:

val list = java.util.Arrays.asList( "https://www.baidu.com/", "https://www.github.com", "http://ice1000.com") val uris = list .stream .map(new URI(_)) .toArray(new Array[URI](_))

而在 Scala 2.12 中,編譯這段代碼會產生編譯錯誤:

Main.scala:13: error: no type parameters for method map: (x$1: java.util.function.Function[_ >: String, _ <: R])java.util.stream.Stream[R] exist so that it can be applied to arguments (java.util.function.Function[String,java.net.URI]) --- because ---argument expressions type is not compatible with formal parameter type; found : java.util.function.Function[String,java.net.URI] required: java.util.function.Function[_ >: String, _ <: ?R]Note: String <: Any, but Java-defined trait Function is invariant in type T.You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10) .map(new URI(_)) ^Main.scala:13: error: type mismatch; found : java.util.function.Function[String,java.net.URI] required: java.util.function.Function[_ >: String, _ <: R] .map(new URI(_)) ^two errors found

4、SBT 1.x 支持 #3872

推薦閱讀:

Scala 的語言設計有哪些缺陷?

TAG:Scala | Dotty |