我已经编写了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中的错误是否是额外的逻辑?如何修复错误?
谢谢!
答案 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)
}
提示:编写函数的预期返回类型,以查看在这种情况下出现了什么问题。