本篇内容介绍了“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扩大内部类作用域的方式有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。