带有泛型的scala向下转换
我正在寻求以下问题的帮助:带有泛型的scala向下转换,scala,generics,downcast,Scala,Generics,Downcast,我正在寻求以下问题的帮助: case class A(val name: String) class B(name: String) extends A(name) class Base[T <: A](param: T) class SubClass[T <: B](param: T) object Factory { def create[T <: A](param: T) = { param.name match { case "somethi
case class A(val name: String)
class B(name: String) extends A(name)
class Base[T <: A](param: T)
class SubClass[T <: B](param: T)
object Factory {
def create[T <: A](param: T) = {
param.name match {
case "something" => new Base(param)
case "something else" => new SubClass(param)
}
}
}
案例类别A(val名称:字符串)
类B(名称:String)扩展了A(名称)
类基[T为什么不先匹配参数
param match {
case b : B => ...
case a : A => ...
}
你为什么不先匹配一下param
param match {
case b : B => ...
case a : A => ...
}
如果提供类型参数,则编译并运行OK:
case "something else" => new SubClass[T](param)
它是否应该编译是值得怀疑的,因为如果发生此匹配并且T
不是aB
,它将在运行时给出一个ClassCastException
更干净的解决方案是按照Daniel所说的匹配类型。如果您提供类型参数,则编译并运行OK:
case "something else" => new SubClass[T](param)
它是否应该编译是值得怀疑的,因为如果发生此匹配并且T
不是aB
,它将在运行时给出一个ClassCastException
更干净的解决方案是按照Daniel所说的匹配类型。T:B类扩展A
并不是一开始就编译的…感谢您的评论senia和luigi。拼写错误已修复。它的编译与问题无关。@user1467422:您应该从B类(val name:String)扩展A(name)中删除val
T:B类扩展A
不是一开始就编译的…感谢您的评论senia和luigi。拼写错误已修复。它除了有问题之外还可以编译。@user1467422:您应该从B类(val name:String)扩展A(name)中删除val
。有人解释它为什么进行打字吗?有人解释它为什么进行打字吗?