带有泛型的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
不是a
B
,它将在运行时给出一个
ClassCastException


更干净的解决方案是按照Daniel所说的匹配类型。

如果您提供类型参数,则编译并运行OK:

case "something else" => new SubClass[T](param)
它是否应该编译是值得怀疑的,因为如果发生此匹配并且
T
不是a
B
,它将在运行时给出一个
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
。有人解释它为什么进行打字吗?有人解释它为什么进行打字吗?