千家信息网

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

发表于:2025-01-30 作者:千家信息网编辑
千家信息网最后更新 2025年01月30日,本篇内容介绍了"Scala扩大内部类作用域的方式有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
千家信息网最后更新 2025年01月30日Scala扩大内部类作用域的方式有哪些

本篇内容介绍了"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 }}


报错截图:

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

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

代码实例:

直接把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扩大内部类作用域的方式有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0