﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小p的乐园-文章分类-scala</title><link>http://www.blogjava.net/heizhipian/category/48480.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 08 May 2011 16:03:14 GMT</lastBuildDate><pubDate>Sun, 08 May 2011 16:03:14 GMT</pubDate><ttl>60</ttl><item><title>scala学习--强大的静态类型推断</title><link>http://www.blogjava.net/heizhipian/articles/349746.html</link><dc:creator>开心的小p</dc:creator><author>开心的小p</author><pubDate>Sat, 07 May 2011 10:51:00 GMT</pubDate><guid>http://www.blogjava.net/heizhipian/articles/349746.html</guid><wfw:comment>http://www.blogjava.net/heizhipian/comments/349746.html</wfw:comment><comments>http://www.blogjava.net/heizhipian/articles/349746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/heizhipian/comments/commentRss/349746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/heizhipian/services/trackbacks/349746.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<strong>可检验属性</strong>。静态类型系统可以保证消除某些运行时的错误。例如可以保证：布尔型不会与<br />
整数型相加；私有变量不会从类的外部被访问；用正确数量的参数调用了函数；字符串集只能加入<br />
字符串。<br />
不过当前的静态类型系统还不能查到其他类型的错误。比方说，通常查不到无法终结的函数，数组<br />
越界，或除零错误。同样也查不到你的程序不符合规格说明书（假设有这么一份规格说明书）。因<br />
此有些人认为静态类型系统不太有用而忽视它。批评说既然这种类型系统只能发现简单错误，而单<br />
元测试能提供更广泛的覆盖，那又为何自寻烦恼使用静态类型呢？我们认为这种说法不正确。尽管<br />
静态类型系统确实不能替代单元测试，但是却能减少用来测试这些属性的单元测试的数量。同样，<br />
单元测试也不能替代静态类型。总而言之，如Edsger Dijkstra 所说，测试只能证明存在错误，而非<br />
不存在。14因此，静态类型能给的保证或许很简单，但这些保证无论多少测试都给不了。<br />
<strong>安全的重构</strong>。静态类型系统提供了让你具有高度信心去变动代码基础的安全网。试想一个给<br />
方法新增参数的重构实例。在静态类型语言中，你可以完成修改，重编译你的系统并简单地修改所<br />
有引起类型错误的代码行。一旦完成了这些，你可以确信已经发现了所有需要修改的地方。这种信<br />
心对于其他的简单重构，如改变方法名或把方法从一个类移到另一个，都会有效。静态类型检查会<br />
在所有的例子中提供足够的确信，表明新系统和旧系统可以一样的工作。<br />
<strong>文档</strong>。静态类型是被编译器检查过正确性的程序文档。不像普通的注释，类型标注永远都不<br />
会过期（至少如果包含它的源文件近期刚刚通过编译就不会）。更进一步说，编译器和集成开发环<br />
境可以利用类型标注提供更好的上下文帮助。举例来说，集成开发环境可以通过判定选中表达式的<br />
静态类型，找到类型的所有成员，并全部显示出来。 <br />
<br />
def f(x: String) = ...<br />
知道f 的变量应该是String 是有用的。另一方面，以下例子中两个标注至少有一个是讨厌的：<br />
val x: HashMap[Int, String] = new HashMap[Int, String]()<br />
很明显，x 是以Int 为键，String 为值的HashMap 这句话说一遍就够了；同样的句子没必要重<br />
复两遍。<br />
Scala 有非常精于此道的类型推断系统，能让你省略几乎所有的通常被认为是讨厌的类型信息。前面<br />
的例子可以改写成以下两种方式：<br />
val x = new HashMap[Int, String]()<br />
val x: Map[Int, String] = new HashMap()<br />
Scala 里的类型推断不止于此。实际上，就算用户代码丝毫没有显式类型也不稀奇。因此，Scala 程<br />
序经常看上去有点像是动态类型脚本语言写出来的程序。尤其在客户应用代码中作为预编译代码库<br />
控件的胶水代码时，表现得更为显著。而对于库控件来说不是这么回事，因为它们常常用到相当精<br />
妙的类型去使其适于灵活使用的模式。这是由代码的实际情况决定的。毕竟，构成可重用控件接口<br />
的成员的类型符号应该是显式给出的，因为它们构成了控件和它的使用者间契约的重要部分。
<img src ="http://www.blogjava.net/heizhipian/aggbug/349746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/heizhipian/" target="_blank">开心的小p</a> 2011-05-07 18:51 <a href="http://www.blogjava.net/heizhipian/articles/349746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>