温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Scala扩大内部类作用域的方式有哪些

发布时间:2021-12-08 15:19:27 来源:亿速云 阅读:147 作者:iii 栏目:大数据

本篇内容介绍了“Scala扩大内部类作用域的方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

内部类初始用户,内部类的作用域属于:外部类对象,不同外部类对象中的内部类对象类型不同会报错type mismatch。

实例代码:

注意:

    定义了一个外部类Person 和一个内部类Student

package com.hadoop.ljs.spark.studyimport scala.collection.mutable.ArrayBuffer/**  * @author: Created By lujisen  * @company ChinaUnicom Software JiNan  * @date: 2020-02-08 22:49  * @version: v1.0  * @description: com.hadoop.ljs.spark.study  */class Person {  class  Student(val name:String){}  val students=new ArrayBuffer[Student]  def getStudent(name:String):Student={    return  new Student(name)  }}

主函数:

    这里person2对象里面的student内部类对象  和person1对象里面的内部类对象报错 type mismatch 

    报错原因:由于默认情况下,内部类的作用域是:外部类对象 一定记住是外部类对象*

package com.hadoop.ljs.spark.study/**  * @author: Created By lujisen  * @company ChinaUnicom Software JiNan  * @date: 2020-02-08 22:19  * @version: v1.0  * @description: com.hadoop.ljs.spark.study  */object  PersonTest{  def main(args: Array[String]): Unit = {    val person1=new Person()    val studentA=person1.getStudent("ljs1")
   person1.students+=studentA
   val person2=new Person()    val studentB=person2.getStudent("ljs2")    /*这里person2对象里面的student内部类对象  和person1对象里面的内部类对象报错 type mismatch    * 这里由于默认情况下,内部类的作用域是:外部类对象 一定记住是外部类对象*/    person1.students+=studentB  }}


报错截图:

Scala扩大内部类作用域的方式有哪些

有两种方式来扩大内部类对象作用域:

第一种方式:通过派生类对象

代码实例:

    直接把Student定义在伴生对象object Person中,程序运行正常

package com.hadoop.ljs.spark.studyimport com.hadoop.ljs.spark.study.Person2.Studentimport scala.collection.mutable.ArrayBuffer/**  * @author: Created By lujisen  * @company ChinaUnicom Software JiNan  * @date: 2020-02-08 22:43  * @version: v1.0  * @description: com.hadoop.ljs.spark.study  */object Person2{  class  Student(val name:String){}}class Person2 {  val students=new ArrayBuffer[Person2.Student]  def getStudent(name:String):Student={    return  new Student(name)  }}

主函数类不再报错了:

package com.hadoop.ljs.spark.study/**  * @author: Created By lujisen  * @company ChinaUnicom Software JiNan  * @date: 2020-02-08 22:37  * @version: v1.0  * @description: com.hadoop.ljs.spark.study  */object PersonTest2 {  def main(args: Array[String]): Unit = {    val person1=new Person2()    val studentA=person1.getStudent("ljs1")    person1.students+=studentA
   val person2=new Person2()    val studentB=person2.getStudent("ljs2")    person1.students+=studentB  }}

第二种方式扩大内部类作用域:类型投影

Person类代码:

注意:

     代码第14行,这里用了Person#Student   用的是“#”号  通过类型映射:只要你是外部类的内部类对象我都识别为类型相同*/

package com.hadoop.ljs.spark.study
import scala.collection.mutable.ArrayBuffer/**  * @author: Created By lujisen  * @company ChinaUnicom Software JiNan  * @date: 2020-02-08 22:55  * @version: v1.0  * @description: com.hadoop.ljs.spark.study  */class Person3 {  class  Student(val name:String){}  /*注意这里用了Person#Student   用的是“#”号  通过类型映射:只要你是外部类的内部类对象我都识别为类型相同*/  val students=new ArrayBuffer[Person3#Student]  def getStudent(name:String):Student={    return  new Student(name)  }}

“Scala扩大内部类作用域的方式有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI