我有一个变量 user ,其类型为VertexProperty。当我在spark-shell中输入 user 时,我明白了,
res67: VertexProperty = User(273,0,A806683,Gustavo,Wilcox,127,NULL,Employee,1,0,0,1)
我可以通过user.id访问用户的id,但是我不能以这种方式访问offset,userCode和其他属性。为什么会这样?我如何访问它们?我无法理解OOP的这些属性。提前谢谢。
VertexProperty定义如下:
class VertexProperty(val id:Long) extends Serializable
case class User(val userId:Long, var offset:Int, val userCode:String, val Name:String, val Surname:String, val organizational_unit:String, val UME:String, val person_type:String, val SOD_HIGH:String, val SOD_MEDIUM:String, val SOD_LOW:String, val Under_mitigated:String) extends VertexProperty(userId)
case class Account(val accountId:Long, var offset:Int, val userCode:String, val userId:String, val account_creation_date:String, var disabled:String, var forcechangepwd:String, var pwdlife:String, var numberloginerror:String, var lastchangepwd:String, var lastlogin:String, var lastwronglogin:String, var state:String, var expire:String, var last_cert_time:String, var creation_date:String, var creation_user:String,var challenge_counter:String, var challenge_failed_attempt:String) extends VertexProperty(accountId) //Check if userCode is actually the code in this example.
case class Application(var applicationId:Long, var offset:Int, var Name:String, var Description:String, var Target:String, var Owner:String, var Ownercode:String, var Creation_date:String, var Creation_user:String) extends VertexProperty(applicationId)
case class Entitlement(val entitlementId:Long, var offset:Int, val Name:String, var Code:String, var Description:String, var Type:String, var Application:String, var Administrative:String, var Parent_ID:String, var Owner_code:String, var Scope_type:String, var Business_name:String, var Business_policy:String, var SOD_high:String, var SOD_medium:String, var SOD_low:String) extends VertexProperty(entitlementId)
答案 0 :(得分:1)
user
的静态类型为VertexProperty
。这意味着编译器只知道它在编译时有一个id
字段,除非你向下转换到其他类型,否则不会让你访问任何其他字段。
这有效,但被认为是不好的做法:
user.asInstanceOf[User].offset
如果实际上不是ClassCastException
,它也会在运行时抛出User
。
这稍微好一点,不会抛出异常:
user match {
case user: User => user.offset
case _ => // handle other cases
}
但实现目标的最佳方法是重构代码,以使user
的静态类型真正User
。