在Scala中调用方法时出现类型不匹配错误
我有一个基类,它的子类是MString和MInt在Scala中调用方法时出现类型不匹配错误,scala,generics,types,Scala,Generics,Types,我有一个基类,它的子类是MString和MInt abstract class Base[T](val name:java.lang.String = "") { def encode(value:T) : Array[Byte] } class MString extends Base[String](name = "string") { def encode(value:String) = { Array[Byte](10,20) } } clas
abstract class Base[T](val name:java.lang.String = "") {
def encode(value:T) : Array[Byte]
}
class MString extends Base[String](name = "string") {
def encode(value:String) = {
Array[Byte](10,20)
}
}
class MInt extends Base[Int](name = "int") {
def encode(value:Int) = {
Array[Byte](100,11)
}
}
我有一个连接类名和它的一个实例的映射
val m = Map[String, Base[_]]("string" -> new MString, "int" -> new MInt)
在这个映射中,我试图使用字符串作为键来检索对象并调用encode方法
println(m("string").encode("A"))
println(m("int").encode(10))
但是,我遇到了类型不匹配错误:
error: type mismatch;
found : String("A")
required: _$1 where type _$1
println(m("string").encode("A"))
^
/Users/smcho/code/codetemplate/_pl/scala/_learn/exploration/2016/04/03. type_inference.scala:25: error: type mismatch;
found : Int(10)
required: _$1 where type _$1
println(m("int").encode(10))
解决方案是专门使用作为
的实例
println(m("string").asInstanceOf[MString].encode("A"))
println(m("int").asInstanceOf[MInt].encode(10))
为什么会出现这种错误?Scala编译器是否足够聪明,可以从其参数的类型调用该方法,例如(“A”->encode(String)和10->encode(Int))
这是我的代码的一个问题,因为我有另一个映射,它用于获得编码结果
val m2 = Map[String, Any]("int"->10, "string"->"A")
m2 foreach {
case (key, value) => m(key).encode(value)
}
有没有办法解决这个问题?也许,我别无选择,只能专门化从基类继承的每个类型
def encode(input:String, value:Any, m:Map[String, Base[_]]) = {
if (input.startsWith("string"))
m("string").asInstanceOf[MString].encode(value.asInstanceOf[String])
else if (input.startsWith("int"))
m("int").asInstanceOf[MInt].encode(value.asInstanceOf[Int])
else
throw new Exception("Not supported type")
}
val m2 = Map[String, Any]("int"->10, "string"->"A")
m2 foreach {
case (key, value) => println(encode(key, value, m).mkString(":"))
}
运行此代码将显示:
100:11
10:20
我们可以使用match/case简化编码功能:
def encode2(input:String, value:Any, m:Map[String, Base[_]]) = {
input match {
case input if input.startsWith("string")
=> m("string").asInstanceOf[MString].encode(value.asInstanceOf[String])
case input if input.startsWith("int")
=> m("int").asInstanceOf[MInt].encode(value.asInstanceOf[Int])
case _ => throw new Exception("Not supported type")
}
}
您正在从
映射[String,Base[\u]]]
中检索值。这将是一个基[\u]
(类型未知)。编译器无法知道它是MInt
还是MString
。