首页 > 解决方案 > 值 get 不是 java.io.Serializable 的成员

问题描述

我已经编写了 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 方法。我编写了一个代码来检查输入键是否存在于地图中。我收到一个错误:

 **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

为什么可序列化错误发生在 Code2 而不是 Code1?错误是由于 Code2 中的额外逻辑引起的吗?如何修复错误?

谢谢!

标签: scala

解决方案


发生这种情况是因为您的 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)
}

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


推荐阅读