Scala:重载方法和字段及定义参数化字段

重载方法和字段

统一访问原则只是Scala在对待字段和方法方面比Java更统一的一个方面。另 一个差异是Scala里,字段和方法属于相同的命名空间。这使得字段重载无参数方法成为可能。比如说, 你可以改变类ArrayElement中contents的实现,从一个方法变为一个字段,而无需修改类Element中 contents的抽象方法定义,如展示在代码10.4中的那样:

class ArrayElement(conts: 

Array[String]) extends Element {  
 val contents: Array[String] = conts  
}

代码 10.4 用字段重载无参数方法

这个ArrayElement的版本里,字段contents(用 val定义)完美地实现了类Element里的无参数方法contents(用def定义)。

另一方面,Scala里 禁止在同一个类里用同样的名称定义字段和方法,而在Java里这样做被允许。例如,下面的Java类能够 很好地编译:

// 在Java里的代码  
class CompilesFine {  
 private int f = 0;  
 public int f() {  
  return 1;  
 }  
}

但是相应的Scala类将不能编译:

class WontCompile {  
 private var f = 0  // 编译不过,因为字段和方法重名  
 def f = 1 
}

通常情况下,Scala仅为定义准备了两个命名空间,而Java有四个。Java的四个命名空间是字 段,方法,类型和包。与之相对,Scala的两个命名空间是:

 值(字段,方法,包还 有单例对象)

 类型(类和特质名)

Scala把字段和方法放进同一个命名空间的 理由很清楚,因为这样你就可以使用val重载无参数的方法,这种你在Java里做不到的事情。Scala里包 共享了与字段和方法相同的命名空间的原因是为了让你能除了仅仅引用类型名以及单例对象的字段和方 法之外,还能直接引用包。这同样是你在Java中无法做到的。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 参数
, 方法
, scala
, java重载
, 字段
, contents
参数字段
,以便于您获取更多的相关知识。

时间: 2024-11-01 18:20:01

Scala:重载方法和字段及定义参数化字段的相关文章

javascript面向对象编程:如何定义属性字段

都知道js变量有作用域的概念,因此可以使用这个特性定义私有字段,私有字段的初始化主要是通过构造函数. 例如如下定义了一个只读字段first function ListCommon2(afirst) { var first=afirst; this.GetFirst=function ()//定义了一个访问读取字段的特权方法 { return first; } } ListCommon2.prototype.do2=function() { var field= this.GetFirst();/

运算符重载方法,扩展方法,以及方法参数

运算符重载方法 一 些编程语言允许定义运算符如果操作类型的实例,例如System.String,System.Decimal,和System.DateTime,它们 重载了==和!=运算符.但是对于CLR来说,它是完全不知道像"=="和"!="这些运算符是干什么的.编程语言定义了每一种运算符的意义以及当这些运 算符的符号出现时应该生成什么样的代码.例如C#里面,数值类型的当遇到"+"这个符号时,在编译时会生成将两个number加起来的代码,如果是

java-[Java]关于重载方法中的可变参数列表

问题描述 [Java]关于重载方法中的可变参数列表 <Thinking in Java>第105页有一句话不理解 如何理解你应该总是只在重载方法的一个版本上使用可变参数列表,或者压根就不是用它 解决方案 就是当重载一个方法时,选择其中的一个重载使用可变参数,其他的避免使用,否则编译的时候容易出问题.具体的参看http://www.cnblogs.com/lanxuezaipiao/p/3190673.html 解决方案二: 这个道理很简单,比如说你有foo(int x int ... args

wpf dispatcher.begininvoke与匹配的重载方法具有一些无效参数

问题描述 wpf dispatcher.begininvoke与匹配的重载方法具有一些无效参数 wpf dispatcher.begininvoke与匹配的重载方法具有一些无效参数,我在另外一个项目里面用这个方法就有,请问这是为什么呢? 解决方案 两个项目的.net framework 版本一样么?

sqlhelper-C# SqlHelper 重载方法2个参数问题

问题描述 C# SqlHelper 重载方法2个参数问题 ExecuteDataTable方法没有任何 login.xaml.cs重载采用"2"个参数,怎么更改Helper.cs文件 以上有俩图片,在线等. 解决方案 public static DataTable ExecuteDataTable(string sql params SqlParameter[] p) { using (SqlConnection conn = new SqlConnection(connStr)) {

C# 编辑代码时提示错误:与其最匹配的重载方法具有一些无效参数

问题描述 C# 编辑代码时提示错误:与其最匹配的重载方法具有一些无效参数 方法: public void plusOne(ref int numX,ref int numY) { if(numY<8) { numY += 1; } else { numX = numX + 1; numY = 0; } } public void cel() { int num1=1; int num2=1; plusOne(num1,num2);//此处显示错误:与其最匹配的重载方法具有一些无效参数 } 解决方

在BLL里无法显示字段的定义

问题描述 有个问题无法解决,求帮助.我用的是三层架构,我在数据访问层DAL里都已经定义好字段了,可是在BLL里面出现错误:DAL.class并不包含***的定义,这个是什么原因,要如何解决 解决方案 解决方案二:将bll定义为publicstatic或者将bll重新生成一下在dal中添加对bll的引用解决方案三:还有bll中的字段也设置为publicstatic解决方案四:重新生成解决方案!解决方案五:还是无法解决解决方案六:字段是否定义,是否设置正确属性解决方案七:using是非用了?解决方案

java-Java重载问题,下面两个重载方法怎么区分调用?

问题描述 Java重载问题,下面两个重载方法怎么区分调用? public String remove(String token , Object o); public String remove(String token , List objs); 解决方案 建议参考http://my.oschina.net/sel/blog/223229,里面对重载方法匹配的优先级解释得很详细.对于上面这个,参数会优先匹配更精确的类型.找不到的情况下,才会去找它的父类或可转化类型等 解决方案二: 重载的同名方

java虚拟机如何调用系统函数中的重载方法

问题描述 本人近来无事,研究下java虚拟机,java虚拟机如何调用同一类中的重载方法