值get不是java.io.Serializable的成员

时间:2018-05-18 14:14:36

标签: scala

我已经编写了2个代码。两个代码的功能都是相同的。代码都将用户数据存储在地图中,在提供密钥时我们得到了相应的用户数据。我在code2中编写了一个额外的逻辑,我在下面提到过。

代码1:

class user(var name:String,var id:Int, var gender:Option[String])
{
override def toString="("+ name+","+id+","+gender+")"
}
object a
{
def main(args:Array[String]):Unit={
var a=new user("kl",90,Some("Male"))
println(a.name,a.id,a.gender)//ACESS VALUES

 //DEFINING MAP
 var mm=Map(1-> new user("jh",189,Some("Male")),2->new user("gh",12,None),3
  ->new user("io",100,Some("Female")))

  // defining method giving o/p value of specific key of mm

 def getkey(i:Int)=
 { mm.get(i)
 }
 var u1=getkey(readLine("ENTER THE KEY").toInt) // some[user]
 println(u1.getClass.getName)
 if(u1.isDefined)
 {
 println(u1.get+","+u1.get.name+","+u1.get.id+","+u1.get.gender)
 }
 }
 }

Code1 1正常工作,O / P正确。我在Code2中添加了额外的逻辑。额外的逻辑是getKey方法。我编写了一个代码来检查输入键是否存在于map中。在那里我收到一个错误:

 **value get is not a member of java.io.Serializable**_

代码2:

class user(var name:String,var id:Int, var gender:Option[String]) 
{
override def toString="("+ name+","+id+","+gender+")"
}
object a
{
def main(args:Array[String]):Unit={
var a=new user("kl",90,Some("Male"))
println(a.name,a.id,a.gender)//ACESS VALUES

//DEFINING MAP
var mm=Map(1-> new user("jh",189,Some("Male")),2->new user("gh",12,None),3-> new user("io",100,Some("Female")))

 // defining method giving o/p value of specific key of mm
 def getkey(i:Int)=
 {  
 //EXTRA LOGIC
 var a=(mm.keys).toList
 if(a.contains(i)){mm.get(i)}
 else {"NO SUCH ELEMENT EXCEPTION , KEY DOESNT MATCH"}
 }

 print("ENTER THE KEY \n")

 var u1=getkey(1) // some[user]
 println(u1.get)

 }
 }

错误 -

enter code here
eg1.Option.scala:27: error: value get is not a member of 
java.io.Serializable
println(u1.get)
       ^
one error found

为什么在Ser2中出现seriliazable错误而在Code1中没有? Code2中的错误是否是额外的逻辑?如何修复错误?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是因为你的getKey函数返回类型是io.Serializable。 原因是if表达式的每个分支都返回不同的类型:

def getkey(i:Int) = { // io.Serializable
  //EXTRA LOGIC
  var a=(mm.keys).toList
  if(a.contains(i)) { mm.get(i) } // option here
  else { "NO SUCH ELEMENT EXCEPTION , KEY DOESNT MATCH" } // string here
}

考虑重写你的函数,所以它的返回类型是Option[User],其中一种方法是:

def getkey(i:Int): Option[user] = { 
  //EXTRA LOGIC
  var a=(mm.keys).toList
  if(a.contains(i)) { mm.get(i) }
  else { None }
}

但是,不需要检查键,您可以将此功能简化为:

def getkey(i:Int): Option[user] = { 
  //EXTRA LOGIC
  m.get(i)
}

提示:编写函数的预期返回类型,以查看在这种情况下出现了什么问题。